Commit 3ecf221f authored by Theodore Y. Ts'o's avatar Theodore Y. Ts'o Committed by Linus Torvalds

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().
parent 5abe769b
...@@ -314,7 +314,7 @@ void ext3_htree_free_dir_info(struct dir_private_info *p) ...@@ -314,7 +314,7 @@ void ext3_htree_free_dir_info(struct dir_private_info *p)
/* /*
* Given a directory entry, enter it into the fname rb tree. * 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, __u32 minor_hash,
struct ext3_dir_entry_2 *dirent) struct ext3_dir_entry_2 *dirent)
{ {
...@@ -329,6 +329,8 @@ void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, ...@@ -329,6 +329,8 @@ void ext3_htree_store_dirent(struct file *dir_file, __u32 hash,
/* Create and allocate the fname structure */ /* Create and allocate the fname structure */
len = sizeof(struct fname) + dirent->name_len + 1; len = sizeof(struct fname) + dirent->name_len + 1;
new_fn = kmalloc(len, GFP_KERNEL); new_fn = kmalloc(len, GFP_KERNEL);
if (!new_fn)
return -ENOMEM;
memset(new_fn, 0, len); memset(new_fn, 0, len);
new_fn->hash = hash; new_fn->hash = hash;
new_fn->minor_hash = minor_hash; new_fn->minor_hash = minor_hash;
...@@ -350,7 +352,7 @@ void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, ...@@ -350,7 +352,7 @@ void ext3_htree_store_dirent(struct file *dir_file, __u32 hash,
(new_fn->minor_hash == fname->minor_hash)) { (new_fn->minor_hash == fname->minor_hash)) {
new_fn->next = fname->next; new_fn->next = fname->next;
fname->next = new_fn; fname->next = new_fn;
return; return 0;
} }
if (new_fn->hash < fname->hash) if (new_fn->hash < fname->hash)
...@@ -365,6 +367,7 @@ void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, ...@@ -365,6 +367,7 @@ void ext3_htree_store_dirent(struct file *dir_file, __u32 hash,
rb_link_node(&new_fn->rb_hash, parent, p); rb_link_node(&new_fn->rb_hash, parent, p);
rb_insert_color(&new_fn->rb_hash, &info->root); rb_insert_color(&new_fn->rb_hash, &info->root);
return 0;
} }
......
...@@ -552,9 +552,11 @@ int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, ...@@ -552,9 +552,11 @@ int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,
/* Add '.' and '..' from the htree header */ /* Add '.' and '..' from the htree header */
if (!start_hash && !start_minor_hash) { if (!start_hash && !start_minor_hash) {
de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data; 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); 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; count += 2;
} }
...@@ -573,8 +575,9 @@ int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, ...@@ -573,8 +575,9 @@ int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,
((hinfo.hash == start_hash) && ((hinfo.hash == start_hash) &&
(hinfo.minor_hash < start_minor_hash))) (hinfo.minor_hash < start_minor_hash)))
continue; continue;
ext3_htree_store_dirent(dir_file, hinfo.hash, if ((err = ext3_htree_store_dirent(dir_file,
hinfo.minor_hash, de); hinfo.hash, hinfo.minor_hash, de)) != 0)
goto errout;
count++; count++;
} }
brelse (bh); brelse (bh);
......
...@@ -689,7 +689,7 @@ extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb, ...@@ -689,7 +689,7 @@ extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb,
extern int ext3_check_dir_entry(const char *, struct inode *, extern int ext3_check_dir_entry(const char *, struct inode *,
struct ext3_dir_entry_2 *, struct ext3_dir_entry_2 *,
struct buffer_head *, unsigned long); 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, __u32 minor_hash,
struct ext3_dir_entry_2 *dirent); struct ext3_dir_entry_2 *dirent);
extern void ext3_htree_free_dir_info(struct dir_private_info *p); extern void ext3_htree_free_dir_info(struct dir_private_info *p);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment