Here's what I've committed into the e2fsprogs tree. - Ted # HG changeset patch # User tytso@xxxxxxx # Date 1182556401 14400 # Node ID deeb424beb36d9fb1ff401aca7a5761a451436b8 # Parent 702632e66380e459f60b238570edd1e911dd46bc Fix byte-swapping issues for the i_extra_size field Thanks to Andreas Dilger and Kalpak Shah for spotting this problem. Signed-off-by: "Theodore Ts'o" <tytso@xxxxxxx> diff -r 702632e66380 -r deeb424beb36 lib/ext2fs/ChangeLog --- a/lib/ext2fs/ChangeLog Fri Jun 22 02:22:38 2007 -0400 +++ b/lib/ext2fs/ChangeLog Fri Jun 22 19:53:21 2007 -0400 @@ -1,3 +1,8 @@ 2007-06-12 Theodore Tso <tytso@xxxxxxx +2007-06-22 Theodore Tso <tytso@xxxxxxx> + + * swapfs.c (ext2fs_swap_inode_full): Fix byte-swapping issues for + i_extra_size field. + 2007-06-12 Theodore Tso <tytso@xxxxxxx> * openfs.c (ext2fs_open2): We now set EXT2_FLAG_MASTER_SB_ONLY diff -r 702632e66380 -r deeb424beb36 lib/ext2fs/swapfs.c --- a/lib/ext2fs/swapfs.c Fri Jun 22 02:22:38 2007 -0400 +++ b/lib/ext2fs/swapfs.c Fri Jun 22 19:53:21 2007 -0400 @@ -133,7 +133,7 @@ void ext2fs_swap_inode_full(ext2_filsys struct ext2_inode_large *f, int hostorder, int bufsize) { - unsigned i, has_data_blocks; + unsigned i, has_data_blocks, extra_isize; int islnk = 0; __u32 *eaf, *eat; @@ -214,31 +214,35 @@ void ext2fs_swap_inode_full(ext2_filsys if (bufsize < (int) (sizeof(struct ext2_inode) + sizeof(__u16))) return; /* no i_extra_isize field */ + if (hostorder) + extra_isize = f->i_extra_isize; t->i_extra_isize = ext2fs_swab16(f->i_extra_isize); - if (t->i_extra_isize > EXT2_INODE_SIZE(fs->super) - + if (!hostorder) + extra_isize = t->i_extra_isize; + if (extra_isize > EXT2_INODE_SIZE(fs->super) - sizeof(struct ext2_inode)) { /* this is error case: i_extra_size is too large */ return; } - i = sizeof(struct ext2_inode) + t->i_extra_isize + sizeof(__u32); + i = sizeof(struct ext2_inode) + extra_isize + sizeof(__u32); if (bufsize < (int) i) return; /* no space for EA magic */ eaf = (__u32 *) (((char *) f) + sizeof(struct ext2_inode) + - f->i_extra_isize); + extra_isize); if (ext2fs_swab32(*eaf) != EXT2_EXT_ATTR_MAGIC) return; /* it seems no magic here */ eat = (__u32 *) (((char *) t) + sizeof(struct ext2_inode) + - f->i_extra_isize); + extra_isize); *eat = ext2fs_swab32(*eaf); /* convert EA(s) */ ext2fs_swap_ext_attr((char *) (eat + 1), (char *) (eaf + 1), bufsize - sizeof(struct ext2_inode) - - t->i_extra_isize - sizeof(__u32), 0); + extra_isize - sizeof(__u32), 0); } - To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html