]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cifs: don't call cifs_dfs_query_info_nonascii_quirk() if nodfs was set
authorEnzo Matsumiya <ematsumiya@suse.de>
Wed, 18 May 2022 16:31:55 +0000 (13:31 -0300)
committerSteve French <stfrench@microsoft.com>
Fri, 20 May 2022 22:38:11 +0000 (17:38 -0500)
Also return EOPNOTSUPP if path is remote but nodfs was set.

Fixes: a2809d0e1696 ("cifs: quirk for STATUS_OBJECT_NAME_INVALID returned for non-ASCII dfs refs")
Cc: stable@vger.kernel.org
Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/connect.c

index 42e14f408856d6e6d40f6ecaada3e350f893b4da..0505d7782e4255d1c9ae7ada35e1d3b4733ffa57 100644 (file)
@@ -3432,6 +3432,7 @@ static int is_path_remote(struct mount_ctx *mnt_ctx)
        struct cifs_tcon *tcon = mnt_ctx->tcon;
        struct smb3_fs_context *ctx = mnt_ctx->fs_ctx;
        char *full_path;
+       bool nodfs = cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS;
 
        if (!server->ops->is_path_accessible)
                return -EOPNOTSUPP;
@@ -3449,14 +3450,20 @@ static int is_path_remote(struct mount_ctx *mnt_ctx)
        rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
                                             full_path);
 #ifdef CONFIG_CIFS_DFS_UPCALL
+       if (nodfs) {
+               if (rc == -EREMOTE)
+                       rc = -EOPNOTSUPP;
+               goto out;
+       }
+
+       /* path *might* exist with non-ASCII characters in DFS root
+        * try again with full path (only if nodfs is not set) */
        if (rc == -ENOENT && is_tcon_dfs(tcon))
                rc = cifs_dfs_query_info_nonascii_quirk(xid, tcon, cifs_sb,
                                                        full_path);
 #endif
-       if (rc != 0 && rc != -EREMOTE) {
-               kfree(full_path);
-               return rc;
-       }
+       if (rc != 0 && rc != -EREMOTE)
+               goto out;
 
        if (rc != -EREMOTE) {
                rc = cifs_are_all_path_components_accessible(server, xid, tcon,
@@ -3468,6 +3475,7 @@ static int is_path_remote(struct mount_ctx *mnt_ctx)
                }
        }
 
+out:
        kfree(full_path);
        return rc;
 }