diff options
author | Paulo Alcantara <pc@cjr.nz> | 2022-12-17 05:25:38 +0300 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2022-12-19 17:03:12 +0300 |
commit | 466611e4af8252dce253cfaebdc7b0019acdbe7e (patch) | |
tree | 33bf5abfacfc4137cb670ff568329982c7bc040f /fs | |
parent | a85ceafd41927e41a4103d228a993df7edd8823b (diff) | |
download | linux-466611e4af8252dce253cfaebdc7b0019acdbe7e.tar.xz |
cifs: fix source pathname comparison of dfs supers
We store the TCP_Server_Info::origin_fullpath path canonicalised
(e.g. with '\\' path separators), so ignore separators when comparing
it with smb3_fs_context::source.
Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cifs/connect.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 069e894d5917..a66c7422b8bc 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -1412,6 +1412,20 @@ match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx) return true; } +static bool dfs_src_pathname_equal(const char *s1, const char *s2) +{ + if (strlen(s1) != strlen(s2)) + return false; + for (; *s1; s1++, s2++) { + if (*s1 == '/' || *s1 == '\\') { + if (*s2 != '/' && *s2 != '\\') + return false; + } else if (tolower(*s1) != tolower(*s2)) + return false; + } + return true; +} + /* this function must be called with srv_lock held */ static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context *ctx, bool dfs_super_cmp) @@ -1449,7 +1463,7 @@ static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context * */ if (dfs_super_cmp) { if (!ctx->source || !server->origin_fullpath || - strcasecmp(server->origin_fullpath, ctx->source)) + !dfs_src_pathname_equal(server->origin_fullpath, ctx->source)) return 0; } else { /* Skip addr, hostname and port matching for DFS connections */ |