mirror of
https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
synced 2024-11-24 18:43:53 +08:00
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@mit.edu>
This commit is contained in:
parent
a34c6ffd68
commit
c844010cc4
@ -1,3 +1,8 @@
|
||||
2007-06-22 Theodore Tso <tytso@mit.edu>
|
||||
|
||||
* swapfs.c (ext2fs_swap_inode_full): Fix byte-swapping issues for
|
||||
i_extra_size field.
|
||||
|
||||
2007-06-12 Theodore Tso <tytso@mit.edu>
|
||||
|
||||
* openfs.c (ext2fs_open2): We now set EXT2_FLAG_MASTER_SB_ONLY
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user