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;
 | 
						|
}
 |