diff options
author | Theodore Ts'o <tytso@mit.edu> | 2010-05-16 23:00:00 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2010-05-16 23:00:00 -0400 |
commit | f70f362b4a6fe47c239dbfb3efc0cc2c10e4f09c (patch) | |
tree | b9db08f3675d1cc0ed7d1af08418f5f5ba554ca6 /fs/ext4 | |
parent | 12e9b892002d9af057655d35b44db8ee9243b0dc (diff) |
ext4: Avoid crashing on NULL ptr dereference on a filesystem error
If the EOFBLOCK_FL flag is set when it should not be and the inode is
zero length, then eh_entries is zero, and ex is NULL, so dereferencing
ex to print ex->ee_block causes a kernel OOPS in
ext4_ext_map_blocks().
On top of that, the error message which is printed isn't very helpful.
So we fix this by printing something more explanatory which doesn't
involve trying to print ex->ee_block.
Addresses-Google-Bug: #2655740
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/extents.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 42d8ce91adbd..e40d2b793f2d 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -3370,8 +3370,9 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, | |||
3370 | */ | 3370 | */ |
3371 | if (unlikely(path[depth].p_ext == NULL && depth != 0)) { | 3371 | if (unlikely(path[depth].p_ext == NULL && depth != 0)) { |
3372 | EXT4_ERROR_INODE(inode, "bad extent address " | 3372 | EXT4_ERROR_INODE(inode, "bad extent address " |
3373 | "iblock: %d, depth: %d pblock %lld", | 3373 | "lblock: %lu, depth: %d pblock %lld", |
3374 | map->m_lblk, depth, path[depth].p_block); | 3374 | (unsigned long) map->m_lblk, depth, |
3375 | path[depth].p_block); | ||
3375 | err = -EIO; | 3376 | err = -EIO; |
3376 | goto out2; | 3377 | goto out2; |
3377 | } | 3378 | } |
@@ -3501,8 +3502,8 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, | |||
3501 | if (unlikely(ext4_test_inode_flag(inode, EXT4_INODE_EOFBLOCKS))) { | 3502 | if (unlikely(ext4_test_inode_flag(inode, EXT4_INODE_EOFBLOCKS))) { |
3502 | if (unlikely(!eh->eh_entries)) { | 3503 | if (unlikely(!eh->eh_entries)) { |
3503 | EXT4_ERROR_INODE(inode, | 3504 | EXT4_ERROR_INODE(inode, |
3504 | "eh->eh_entries == 0 ee_block %d", | 3505 | "eh->eh_entries == 0 and " |
3505 | ex->ee_block); | 3506 | "EOFBLOCKS_FL set"); |
3506 | err = -EIO; | 3507 | err = -EIO; |
3507 | goto out2; | 3508 | goto out2; |
3508 | } | 3509 | } |