linux/fs/ext4
Theodore Ts'o 1f2acb6017 ext4: Add block validity check when truncating indirect block mapped inodes
Add checks to ext4_free_branches() to make sure a block number found
in an indirect block are valid before trying to free it.  If a bad
block number is found, stop freeing the indirect block immediately,
since the file system is corrupt and we will need to run fsck anyway.
This also avoids spamming the logs, and specifically avoids
driver-level "attempt to access beyond end of device" errors obscure
what is really going on.

If you get *really*, *really*, *really* unlucky, without this patch, a
supposed indirect block containing garbage might contain a reference
to a primary block group descriptor, in which case
ext4_free_branches() could end up zero'ing out a block group
descriptor block, and if then one of the block bitmaps for a block
group described by that bg descriptor block is not in memory, and is
read in by ext4_read_block_bitmap().  This function calls
ext4_valid_block_bitmap(), which assumes that bg_inode_table() was
validated at mount time and hasn't been modified since.  Since this
assumption is no longer valid, it's possible for the value
(ext4_inode_table(sb, desc) - group_first_block) to go negative, which
will cause ext4_find_next_zero_bit() to trigger a kernel GPF.

Addresses-Google-Bug: #2220436

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2010-01-22 17:40:42 -05:00
..
acl.c sanitize xattr handler prototypes 2009-12-16 12:16:49 -05:00
acl.h ext[234]: move over to 'check_acl' permission model 2009-09-08 11:09:04 -07:00
balloc.c ext4: fold ext4_free_blocks() and ext4_mb_free_blocks() 2009-11-22 07:44:56 -05:00
bitmap.c ext4: Change unsigned long to unsigned int 2008-11-05 00:14:04 -05:00
block_validity.c ext4: remove unused #include <linux/version.h> 2009-12-14 09:24:20 -05:00
dir.c ext4: Define a new set of flags for ext4_get_blocks() 2009-05-14 00:58:52 -04:00
ext4_extents.h ext4: Calculate metadata requirements more accurately 2010-01-01 02:41:30 -05:00
ext4_jbd2.c ext4: fold ext4_journal_forget() into ext4_forget() 2009-11-22 21:00:13 -05:00
ext4_jbd2.h ext4: Wait for proper transaction commit on fsync 2009-12-08 23:51:10 -05:00
ext4.h ext4: Add block validity check when truncating indirect block mapped inodes 2010-01-22 17:40:42 -05:00
extents.c ext4: fix async i/o writes beyond 4GB to a sparse file 2010-02-04 23:58:38 -05:00
file.c const: mark struct vm_struct_operations 2009-09-27 11:39:25 -07:00
fsync.c ext4, jbd2: Add barriers for file systems with exernal journals 2009-12-23 06:52:08 -05:00
hash.c ext4: Add support for non-native signed/unsigned htree hash algorithms 2008-10-28 13:21:44 -04:00
ialloc.c ext4: fix build warning when EXT4FS_DEBUG is on 2009-07-27 21:44:40 -04:00
inode.c ext4: Add block validity check when truncating indirect block mapped inodes 2010-01-22 17:40:42 -05:00
ioctl.c ext4: Fix insufficient checks in EXT4_IOC_MOVE_EXT 2009-12-06 23:38:31 -05:00
Kconfig ext4: Don't ask about supporting ext2/3 in ext4 if ext4 is not configured 2009-12-21 10:54:09 -05:00
Makefile ext4: online defrag -- Add EXT4_IOC_MOVE_EXT ioctl 2009-06-17 19:24:03 -04:00
mballoc.c ext4: Add block validity check when truncating indirect block mapped inodes 2010-01-22 17:40:42 -05:00
mballoc.h ext4: remove unused #include <linux/version.h> 2009-12-14 09:24:20 -05:00
migrate.c ext4: quota macros cleanup 2009-12-08 22:42:15 -05:00
move_extent.c ext4: Fix insufficient checks in EXT4_IOC_MOVE_EXT 2009-12-06 23:38:31 -05:00
namei.c ext4: quota macros cleanup 2009-12-08 22:42:15 -05:00
resize.c ext4: Return the PTR_ERR of the correct pointer in setup_new_group_blocks() 2009-12-07 10:38:16 -05:00
super.c ext4: Fix optional-arg mount options 2010-02-15 20:17:55 -05:00
symlink.c ext4: Rename ext4dev to ext4 2008-10-10 20:02:48 -04:00
xattr_security.c sanitize xattr handler prototypes 2009-12-16 12:16:49 -05:00
xattr_trusted.c sanitize xattr handler prototypes 2009-12-16 12:16:49 -05:00
xattr_user.c sanitize xattr handler prototypes 2009-12-16 12:16:49 -05:00
xattr.c ext4: Eliminate potential double free on error path 2009-12-23 07:52:31 -05:00
xattr.h ext4: Rename ext4dev to ext4 2008-10-10 20:02:48 -04:00