cifsd: handle unhashed dentry in ksmbd_vfs_mkdir
authorHyunchul Lee <hyc.lee@gmail.com>
Thu, 1 Apr 2021 08:32:24 +0000 (17:32 +0900)
committerSteve French <stfrench@microsoft.com>
Tue, 11 May 2021 00:15:33 +0000 (19:15 -0500)
vfs_mkdir could return the dentry left unhashed negative on success.

Signed-off-by: Hyunchul Lee <hyc.lee@gmail.com>
Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifsd/vfs.c

index b509c90..bdc30a7 100644 (file)
@@ -190,14 +190,32 @@ int ksmbd_vfs_mkdir(struct ksmbd_work *work, const char *name, umode_t mode)
 
        mode |= S_IFDIR;
        err = vfs_mkdir(&init_user_ns, d_inode(path.dentry), dentry, mode);
-       if (!err) {
+       if (err)
+               goto out;
+       else if (d_unhashed(dentry)) {
+               struct dentry *d;
+
+               d = lookup_one_len(dentry->d_name.name,
+                              dentry->d_parent,
+                              dentry->d_name.len);
+               if (IS_ERR(d)) {
+                       err = PTR_ERR(d);
+                       goto out;
+               }
+               if (unlikely(d_is_negative(d))) {
+                       dput(d);
+                       err = -ENOENT;
+                       goto out;
+               }
+
                ksmbd_vfs_inherit_owner(work, d_inode(path.dentry),
-                       d_inode(dentry));
-       } else {
-               ksmbd_err("mkdir(%s): creation failed (err:%d)\n", name, err);
+                       d_inode(d));
+               dput(d);
        }
-
+out:
        done_path_create(&path, dentry);
+       if (err)
+               ksmbd_err("mkdir(%s): creation failed (err:%d)\n", name, err);
        return err;
 }