From: Theodore Ts'o <tytso@mit.edu> 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: http://git.kernel.org/?p=fs%2Fext2%2Fe2fsprogs.git;a=commitdiff_plain;h=2694f31946f0c168cc8d098f3970f0ae08d94e7b 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 Also, portion of: commit de8f3a76218255e443ba57dec5d74850180fa75d Author: Andreas Dilger <adilger@clusterfs.com> Date: Fri May 25 11:18:11 2007 -0400 Fix gcc -Wall warnings, especially on 64-bit systems Signed-off-by: Andreas Dilger <adilger@clusterfs.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> --- Index: e2fsprogs-1.39/lib/ext2fs/ChangeLog =================================================================== --- e2fsprogs-1.39.orig/lib/ext2fs/ChangeLog 2008-06-19 11:50:13.000000000 -0500 +++ e2fsprogs-1.39/lib/ext2fs/ChangeLog 2008-06-19 11:53:41.183983267 -0500 @@ -17,6 +17,12 @@ (ext2fs_write_inode_full): Fix memory leak on error return (when the inode table is missing). +2006-11-14 Theodore Tso <tytso@mit.edu> + + * ext2fs.h (ext2fs_get_mem, ext2fs_free_mem): Avoid type punning + which causes problems on the ARM processor. (Addresses + Debian Bug: #397044) + 2006-08-30 Eric Sandeen <esandeen@redhat.com> * alloc_tables.c (ext2fs_allocate_group_table): Index: e2fsprogs-1.39/lib/ext2fs/badblocks.c =================================================================== --- e2fsprogs-1.39.orig/lib/ext2fs/badblocks.c 2008-06-19 11:50:13.000000000 -0500 +++ e2fsprogs-1.39/lib/ext2fs/badblocks.c 2008-06-19 11:55:02.038046145 -0500 @@ -43,7 +43,7 @@ static errcode_t make_u32_list(int size, bb->size = size ? size : 10; bb->num = num; retval = ext2fs_get_array(bb->size, sizeof(blk_t), &bb->list); - if (!bb->list) { + if (retval) { ext2fs_free_mem(&bb); return retval; } Index: e2fsprogs-1.39/lib/ext2fs/ext2fs.h =================================================================== --- e2fsprogs-1.39.orig/lib/ext2fs/ext2fs.h 2008-06-19 11:50:13.000000000 -0500 +++ e2fsprogs-1.39/lib/ext2fs/ext2fs.h 2008-06-19 11:50:39.195983006 -0500 @@ -998,11 +998,12 @@ extern unsigned int ext2fs_div_ceil(unsi */ _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; } _INLINE_ errcode_t ext2fs_get_array(unsigned long count, unsigned long size, void *ptr) @@ -1017,10 +1018,12 @@ _INLINE_ errcode_t ext2fs_get_array(unsi */ _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; } @@ -1034,11 +1037,11 @@ _INLINE_ errcode_t ext2fs_resize_mem(uns /* 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 */ Index: e2fsprogs-1.39/resize/ChangeLog =================================================================== --- e2fsprogs-1.39.orig/resize/ChangeLog 2008-09-12 10:43:28.000000000 -0500 +++ e2fsprogs-1.39/resize/ChangeLog 2008-09-12 10:46:01.804077365 -0500 @@ -4,6 +4,10 @@ to make sure the superblock changes are written out to the backup superblocks. +2007-05-22 Theodore Tso <tytso@mit.edu> + + * sim_progress.c (ext2fs_progress_init): Fix type-punning warning. + 2007-03-18 Theodore Tso <tytso@mit.edu> * resize2fs.c (check_and_change_inodes): Check to make sure the diff --git a/resize/sim_progress.c b/resize/sim_progress.c index 103a727..400e364 100644 --- a/resize/sim_progress.c +++ b/resize/sim_progress.c @@ -87,7 +87,7 @@ errcode_t ext2fs_progress_init(ext2_sim_progmeter *ret_prog, return retval; memset(prog, 0, sizeof(struct ext2_sim_progress)); - retval = ext2fs_get_mem(strlen(label)+1, (void **) &prog->label); + retval = ext2fs_get_mem(strlen(label)+1, &prog->label); if (retval) { free(prog); return retval;