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