Skip to content

Commit 8f1dca1

Browse files
Al Virojankara
authored andcommitted
ext2_rename(): set_link and delete_entry may fail
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Reviewed-by: Fabio M. De Francesco <fmdefrancesco@gmail.com> Tested-by: Fabio M. De Francesco <fmdefrancesco@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
1 parent 6e335cd commit 8f1dca1

2 files changed

Lines changed: 16 additions & 25 deletions

File tree

fs/ext2/dir.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -606,8 +606,7 @@ int ext2_delete_entry (struct ext2_dir_entry_2 *dir, struct page *page,
606606
if (de->rec_len == 0) {
607607
ext2_error(inode->i_sb, __func__,
608608
"zero-length directory entry");
609-
err = -EIO;
610-
goto out;
609+
return -EIO;
611610
}
612611
pde = de;
613612
de = ext2_next_entry(de);
@@ -617,17 +616,18 @@ int ext2_delete_entry (struct ext2_dir_entry_2 *dir, struct page *page,
617616
pos = page_offset(page) + from;
618617
lock_page(page);
619618
err = ext2_prepare_chunk(page, pos, to - from);
620-
BUG_ON(err);
619+
if (err) {
620+
unlock_page(page);
621+
return err;
622+
}
621623
if (pde)
622624
pde->rec_len = ext2_rec_len_to_disk(to - from);
623625
dir->inode = 0;
624626
ext2_commit_chunk(page, pos, to - from);
625627
inode->i_ctime = inode->i_mtime = current_time(inode);
626628
EXT2_I(inode)->i_flags &= ~EXT2_BTREE_FL;
627629
mark_inode_dirty(inode);
628-
err = ext2_handle_dirsync(inode);
629-
out:
630-
return err;
630+
return ext2_handle_dirsync(inode);
631631
}
632632

633633
/*

fs/ext2/namei.c

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -335,18 +335,16 @@ static int ext2_rename (struct mnt_idmap * idmap,
335335

336336
err = dquot_initialize(old_dir);
337337
if (err)
338-
goto out;
338+
return err;
339339

340340
err = dquot_initialize(new_dir);
341341
if (err)
342-
goto out;
342+
return err;
343343

344344
old_de = ext2_find_entry(old_dir, &old_dentry->d_name, &old_page,
345345
&old_page_addr);
346-
if (IS_ERR(old_de)) {
347-
err = PTR_ERR(old_de);
348-
goto out;
349-
}
346+
if (IS_ERR(old_de))
347+
return PTR_ERR(old_de);
350348

351349
if (S_ISDIR(old_inode->i_mode)) {
352350
err = -EIO;
@@ -394,27 +392,20 @@ static int ext2_rename (struct mnt_idmap * idmap,
394392
old_inode->i_ctime = current_time(old_inode);
395393
mark_inode_dirty(old_inode);
396394

397-
ext2_delete_entry(old_de, old_page, old_page_addr);
398-
399-
if (dir_de) {
400-
if (old_dir != new_dir) {
395+
err = ext2_delete_entry(old_de, old_page, old_page_addr);
396+
if (!err && dir_de) {
397+
if (old_dir != new_dir)
401398
err = ext2_set_link(old_inode, dir_de, dir_page,
402399
dir_page_addr, new_dir, false);
403400

404-
}
405-
ext2_put_page(dir_page, dir_page_addr);
406401
inode_dec_link_count(old_dir);
407402
}
408-
409-
out_old:
410-
ext2_put_page(old_page, old_page_addr);
411-
out:
412-
return err;
413-
414403
out_dir:
415404
if (dir_de)
416405
ext2_put_page(dir_page, dir_page_addr);
417-
goto out_old;
406+
out_old:
407+
ext2_put_page(old_page, old_page_addr);
408+
return err;
418409
}
419410

420411
const struct inode_operations ext2_dir_inode_operations = {

0 commit comments

Comments
 (0)