• Zheng Liang's avatar
    ovl: fix missing negative dentry check in ovl_rename() · a295aef6
    Zheng Liang authored
    The following reproducer
    
      mkdir lower upper work merge
      touch lower/old
      touch lower/new
      mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work merge
      rm merge/new
      mv merge/old merge/new & unlink upper/new
    
    may result in this race:
    
    PROCESS A:
      rename("merge/old", "merge/new");
      overwrite=true,ovl_lower_positive(old)=true,
      ovl_dentry_is_whiteout(new)=true -> flags |= RENAME_EXCHANGE
    
    PROCESS B:
      unlink("upper/new");
    
    PROCESS A:
      lookup newdentry in new_upperdir
      call vfs_rename() with negative newdentry and RENAME_EXCHANGE
    
    Fix by adding the missing check for negative newdentry.
    Signed-off-by: default avatarZheng Liang <zhengliang6@huawei.com>
    Fixes: e9be9d5e ("overlay filesystem")
    Cc: <stable@vger.kernel.org> # v3.18
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    a295aef6
dir.c 29.8 KB