From: Theodore Ts'o Date: Tue, 14 Nov 2006 05:34:34 +0000 (-0500) Subject: Fix type punning bugs in ext2fs_get_mem() and ext2fs_free_mem() X-Git-Tag: E2FSPROGS-1_40-WIP-1114~5 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=2694f31946f0c168cc8d098f3970f0ae08d94e7b;p=tools%2Fe2fsprogs.git Fix type punning bugs in ext2fs_get_mem() and ext2fs_free_mem() This was causing dumpe2fs to crash on the ARM platform when examining the badblocks list. Also reverts an incorrect fix made by changeset 38078f692c20 Addresses Debian Bug: #397044 --- diff --git a/lib/ext2fs/ChangeLog b/lib/ext2fs/ChangeLog index 4a15a4f..30fda66 100644 --- a/lib/ext2fs/ChangeLog +++ b/lib/ext2fs/ChangeLog @@ -1,3 +1,9 @@ +2006-11-14 Theodore Tso + + * ext2fs.h (ext2fs_get_mem, ext2fs_free_mem): Avoid type punning + which causes problems on the ARM processor. (Addresses + Debian Bug: #397044) + 2006-11-12 Theodore Tso * ext2_fs.h (EXT2_FLAG_SOFTSUPP_FEATURES), openfs.c @@ -8,15 +14,6 @@ * ext3_extents.h, ext2fs.h: Check in ext4 extent headers into the source tree, in preparation for adding full extent support. - * badblocks.c (make_u32_list): Add workaround for GCC bug (ARM, - gcc version 4.1.1-17). The inline function involved is - used all over the e2fsprogs sources, so hopefully this bug - won't hit us in other places, but with this one change the - e2fsprogs regression test suite is passing, so we'll cross - our fingers, report the GCC bug, and hope that it doesn't - cause any data corruption/loss. (Addresses Debian Bug: - #397044; Gcc bug reported as Debian Bug #398316) - * unix_io.c (unix_flush): Allow offsets greater than 2G. (Addresses SourceForge Bug #1547922) diff --git a/lib/ext2fs/badblocks.c b/lib/ext2fs/badblocks.c index 42e33bf..50e6336 100644 --- a/lib/ext2fs/badblocks.c +++ b/lib/ext2fs/badblocks.c @@ -26,10 +26,6 @@ #include "ext2_fs.h" #include "ext2fsP.h" -#ifdef __arm__ -#define BUGGY_ARM_GCC -#endif - /* * Helper function for making a badblocks list */ @@ -46,19 +42,11 @@ static errcode_t make_u32_list(int size, int num, __u32 *list, bb->magic = EXT2_ET_MAGIC_BADBLOCKS_LIST; bb->size = size ? size : 10; bb->num = num; -#ifdef BUGGY_ARM_GCC - bb->list = malloc(bb->size * sizeof(blk_t)); - if (!bb->list) { - free(bb); - return EXT2_ET_NO_MEMORY; - } -#else retval = ext2fs_get_mem(bb->size * sizeof(blk_t), &bb->list); - if (!bb->list) { + if (retval) { ext2fs_free_mem(&bb); return retval; } -#endif if (list) memcpy(bb->list, list, bb->size * sizeof(blk_t)); else diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h index f4214c2..0889cec 100644 --- a/lib/ext2fs/ext2fs.h +++ b/lib/ext2fs/ext2fs.h @@ -1007,11 +1007,12 @@ extern unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b); */ _INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr) { - void **pp = (void **)ptr; + void *pp; - *pp = malloc(size); - if (!*pp) + pp = malloc(size); + if (!pp) return EXT2_ET_NO_MEMORY; + memcpy(ptr, &pp, sizeof (pp)); return 0; } @@ -1020,10 +1021,12 @@ _INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr) */ _INLINE_ errcode_t ext2fs_free_mem(void *ptr) { - void **pp = (void **)ptr; + void *p; - free(*pp); - *pp = 0; + memcpy(&p, ptr, sizeof(p)); + free(p); + p = 0; + memcpy(ptr, &p, sizeof(p)); return 0; } @@ -1037,11 +1040,11 @@ _INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_siz /* Use "memcpy" for pointer assignments here to avoid problems * with C99 strict type aliasing rules. */ - memcpy(&p, ptr, sizeof (p)); + memcpy(&p, ptr, sizeof(p)); p = realloc(p, size); if (!p) return EXT2_ET_NO_MEMORY; - memcpy(ptr, &p, sizeof (p)); + memcpy(ptr, &p, sizeof(p)); return 0; } #endif /* Custom memory routines */