c3d59ad6ab
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>
27 lines
570 B
C
27 lines
570 B
C
/* linux/fs/ext3/namei.h
|
|
*
|
|
* Copyright (C) 2005 Simtec Electronics
|
|
* Ben Dooks <ben@simtec.co.uk>
|
|
*
|
|
*/
|
|
|
|
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;
|
|
}
|