ext2/3 bugfix 3/6: Check for failed kmalloc in ext3_htree_store_dirent
PATCH 1/1 ext2/3 bugfix 3/6: Check for failed kmalloc in ext3_htree_store_dirent
Check for failed kmalloc() in ext3_htree_store_dirent()
This patch checks for a failed kmalloc() in ext3_htree_store_dirent(), and passes the error up to its caller, ext3_htree_fill_tree().
fs/ext3/dir.c | 7 +++++-- fs/ext3/namei.c | 11 +++++++---- include/linux/ext3_fs.h | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-)
fs/ext3/dir.c +5 -2
@@ -314,7 +314,7 @@/* * Given a directory entry, enter it into the fname rb tree. */ -void ext3_htree_store_dirent (struct file *dir_file,__u32 hash, +int ext3_htree_store_dirent (struct file *dir_file,__u32 hash,__u32 minor_hash,struct ext3_dir_entry_2 *dirent) {
@@ -329,6 +329,8 @@/* Create and allocate the fname structure */ len =sizeof (struct fname ) + dirent->name_len +1 ; new_fn =kmalloc (len,GFP_KERNEL ); +if (!new_fn) +return -ENOMEM ;memset (new_fn,0 , len); new_fn->hash = hash; new_fn->minor_hash = minor_hash;
@@ -350,7 +352,7 @@ (new_fn->minor_hash == fname->minor_hash)) { new_fn->next = fname->next; fname->next = new_fn; -return ; +return 0 ; }if (new_fn->hash < fname->hash)
@@ -365,6 +367,7 @@rb_link_node (&new_fn->rb_hash, parent, p);rb_insert_color (&new_fn->rb_hash, &info->root); +return 0 ; }
fs/ext3/namei.c +7 -4
@@ -552,9 +552,11 @@/* Add '.' and '..' from the htree header */ if (!start_hash && !start_minor_hash) { de = (struct ext3_dir_entry_2 *) frames[0 ].bh->b_data; -ext3_htree_store_dirent (dir_file,0 ,0 , de); +if ((err =ext3_htree_store_dirent (dir_file,0 ,0 , de)) !=0 ) + goto errout; de =ext3_next_entry (de); -ext3_htree_store_dirent (dir_file,0 ,0 , de); +if ((err =ext3_htree_store_dirent (dir_file,0 ,0 , de)) !=0 ) + goto errout; count +=2 ; }
@@ -573,8 +575,9 @@ ((hinfo.hash == start_hash) && (hinfo.minor_hash < start_minor_hash))) continue; -ext3_htree_store_dirent (dir_file, hinfo.hash, - hinfo.minor_hash, de); +if ((err =ext3_htree_store_dirent (dir_file, + hinfo.hash, hinfo.minor_hash, de)) !=0 ) + goto errout; count++; }brelse (bh);
include/linux/ext3_fs.h +1 -1
@@ -689,7 +689,7 @@extern int ext3_check_dir_entry (const char *,struct inode *,struct ext3_dir_entry_2 *,struct buffer_head *,unsigned long ); -extern void ext3_htree_store_dirent (struct file *dir_file,__u32 hash, +extern int ext3_htree_store_dirent (struct file *dir_file,__u32 hash,__u32 minor_hash,struct ext3_dir_entry_2 *dirent);extern void ext3_htree_free_dir_info (struct dir_private_info *p);