• Zhihao Cheng's avatar
    ubifs: Fix adding orphan entry twice for the same inode · 7efc34b5
    Zhihao Cheng authored
    The tmpfile could be added into orphan list twice, first time is
    creation, the second time is removing after it is linked. The orphan
    entry could be added twice for tmpfile if following sequence is
    satisfied:
    
    ubifs_tmpfile
     ubifs_jnl_update
      ubifs_add_orphan // first time to add orphan entry
    
        P1                        P2
    ubifs_link                 do_commit
                                ubifs_orphan_start_commit
    			     orphan->cmt = 1
     ubifs_delete_orphan
      orphan_delete
       if (orph->cmt)
        orph->del = 1; // orphan entry is not deleted from tree
        return
    ubifs_unlink
     ubifs_jnl_update
      ubifs_add_orphan
       orphan_add // found old orphan entry, second time to add orphan entry
        ubifs_err(c, "orphaned twice")
        return -EINVAL // unlink failed!
                                ubifs_orphan_end_commit
    			     erase_deleted // delete old orphan entry
    			      rb_erase(&orphan->rb, &c->orph_tree)
    
    Fix it by removing orphan entry from orphan tree in advance, rather than
    remove it from orphan tree in committing process.
    
    Fixes: 32fe905c ("ubifs: Fix O_TMPFILE corner case in ubifs_link()")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=218672Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
    Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
    7efc34b5
orphan.c 23.6 KB