Whamcloud - gitweb
libext2fs: don't cache inodes that fail checksum verification
authorDarrick J. Wong <darrick.wong@oracle.com>
Sun, 3 Aug 2014 02:49:12 +0000 (22:49 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 3 Aug 2014 02:49:23 +0000 (22:49 -0400)
commitb9f95911e9e89a456c9b7bdc0ca68c111a931b30
treec5774e304e91dcbb63537d8d279468b422d36a42
parent2e9d8391560ecde48e0b21f174fdb7bf3331345a
libext2fs: don't cache inodes that fail checksum verification

If an inode fails checksum verification, don't stuff a copy of it in
the inode cache, because this can cause the library to fail to return
the "corrupt inode" error code.

In general, this happens if ext2fs_read_inode_full() is called twice
on an inode with an incorrect checksum.  If fs->flags has
EXT2_FLAG_IGNORE_CSUM_ERRORS set during the first call and *unset*
during the second call, the cache hit during the second call fails to
return EXT2_ET_INODE_CSUM_INVALID as you'd expect.  This happens
during fsck because the first read_inode call happens as part of
check_blocks and the second call happens during inode checksum
revalidation.  A file system with a slightly corrupt non-extent inode
will trigger this.

While we're at it, make the inode read function consistent with the
rest of libext2fs -- copy the metadata object into the caller's buffer
even if it fails checksum verification.  This will help e2fsck avoid a
double re-read later on down the line.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
lib/ext2fs/inode.c
tests/f_no_cache_corrupt_inode/expect.1 [new file with mode: 0644]
tests/f_no_cache_corrupt_inode/expect.2 [new file with mode: 0644]
tests/f_no_cache_corrupt_inode/image.gz [new file with mode: 0644]
tests/f_no_cache_corrupt_inode/name [new file with mode: 0644]