diff options
author | Carlos Maiolino <cmaiolino@redhat.com> | 2012-10-02 23:59:23 -0300 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2012-10-09 23:21:42 +0200 |
commit | c3d59ad6ab0b3d01c10f326bbc9b089424a3a5c4 (patch) | |
tree | d2f67c0b1b7a3fd7b601fd85ca7f21f607fdb55b /fs/ext3/namei.h | |
parent | aa9660196b250b850c9d06046c9f3b1eb965a708 (diff) |
ext3: ext3_bread usage audit
This is the ext3 version of the same patch applied to Ext4, where such goal is
to audit the usage of ext3_bread() due a possible misinterpretion of its return
value.
Focused on directory blocks, a NULL value returned from ext3_bread() means a
hole, which cannot exist into a directory inode. It can pass undetected after a
fix in an uninitialized error variable.
The (now) initialized variable into ext3_getblk() may lead to a zero'ed return
value of ext3_bread() to its callers, which can make the caller do not detect
the hole in the directory inode.
This patch creates a new wrapper function ext3_dir_bread() which checks for
holes properly, reports error, and returns EIO in that case.
Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext3/namei.h')
-rw-r--r-- | fs/ext3/namei.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/fs/ext3/namei.h b/fs/ext3/namei.h index f2ce2b0065c9..46304d8c9f0a 100644 --- a/fs/ext3/namei.h +++ b/fs/ext3/namei.h @@ -6,3 +6,22 @@ */ extern struct dentry *ext3_get_parent(struct dentry *child); + +static inline struct buffer_head *ext3_dir_bread(handle_t *handle, + struct inode *inode, + int block, int create, + int *err) +{ + struct buffer_head *bh; + + bh = ext3_bread(handle, inode, block, create, err); + + if (!bh && !(*err)) { + *err = -EIO; + ext3_error(inode->i_sb, __func__, + "Directory hole detected on inode %lu\n", + inode->i_ino); + return NULL; + } + return bh; +} |