From: Theodore Ts'o Date: Fri, 22 Jun 2007 23:53:21 +0000 (-0400) Subject: Fix byte-swapping issues for the i_extra_size field X-Git-Tag: E2FSPROGS-1_40~9 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=c844010cc41e4c293b652d252145df12448e22c6;p=tools%2Fe2fsprogs.git 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" --- diff --git a/lib/ext2fs/ChangeLog b/lib/ext2fs/ChangeLog index 02604b5..8ee5d83 100644 --- a/lib/ext2fs/ChangeLog +++ b/lib/ext2fs/ChangeLog @@ -1,3 +1,8 @@ +2007-06-22 Theodore Tso + + * swapfs.c (ext2fs_swap_inode_full): Fix byte-swapping issues for + i_extra_size field. + 2007-06-12 Theodore Tso * openfs.c (ext2fs_open2): We now set EXT2_FLAG_MASTER_SB_ONLY diff --git a/lib/ext2fs/swapfs.c b/lib/ext2fs/swapfs.c index a214ad4..a40caa9 100644 --- a/lib/ext2fs/swapfs.c +++ b/lib/ext2fs/swapfs.c @@ -133,7 +133,7 @@ void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t, 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 fs, struct ext2_inode_large *t, 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); }