Skip to content

Commit

Permalink
libext2fs: initialize i_extra_isize when writing EAs
Browse files Browse the repository at this point in the history
If i_extra_isize is zero when we try to write extended attributes,
we'll end up writing the EA magic into the i_extra_isize field, which
causes a subsequent crash on big endian systems (when we try to write
0xEA02 bytes past the inode!).  Therefore when the field is zero, set
i_extra_isize to the desired extra_isize size, zero those bytes, and
write the EAs after the end of the extended inode.

v2: Don't bother if we have 128b inodes, and ensure that the value
is 32b-aligned so that the EA magic starts on a 32b boundary.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
  • Loading branch information
djwong authored and tytso committed Jan 27, 2015
1 parent d0bc2c8 commit 366d299
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 0 deletions.
12 changes: 12 additions & 0 deletions lib/ext2fs/ext_attr.c
Expand Up @@ -519,6 +519,18 @@ errcode_t ext2fs_xattrs_write(struct ext2_xattr_handle *handle)
if (err)
goto out;

/* If extra_isize isn't set, we need to set it now */
if (inode->i_extra_isize == 0 &&
EXT2_INODE_SIZE(handle->fs->super) > EXT2_GOOD_OLD_INODE_SIZE) {
char *p = (char *)inode;
size_t extra = handle->fs->super->s_want_extra_isize;

if (extra == 0)
extra = sizeof(__u32);
memset(p + EXT2_GOOD_OLD_INODE_SIZE, 0, extra);
inode->i_extra_isize = extra;
}

move_inline_data_to_front(handle);

x = handle->attrs;
Expand Down
12 changes: 12 additions & 0 deletions tests/f_write_ea_no_extra_isize/expect.1
@@ -0,0 +1,12 @@
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Directory inode 12, block #0, offset 4: directory corrupted
Salvage? yes

Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information

test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
test_filesys: 12/128 files (0.0% non-contiguous), 17/512 blocks
Exit status is 1
7 changes: 7 additions & 0 deletions tests/f_write_ea_no_extra_isize/expect.2
@@ -0,0 +1,7 @@
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
test_filesys: 12/128 files (0.0% non-contiguous), 17/512 blocks
Exit status is 0
Binary file added tests/f_write_ea_no_extra_isize/image.gz
Binary file not shown.
1 change: 1 addition & 0 deletions tests/f_write_ea_no_extra_isize/name
@@ -0,0 +1 @@
write EA when i_extra_size is zero

0 comments on commit 366d299

Please sign in to comment.