s3: smbd: Move the initialization of the filename and the call to canonicalize_snapsh...
authorJeremy Allison <jra@samba.org>
Tue, 5 May 2020 02:29:17 +0000 (19:29 -0700)
committerJeremy Allison <jra@samba.org>
Tue, 5 May 2020 19:18:43 +0000 (19:18 +0000)
canonicalize_snapshot_path() may eat the incoming pathname in total
for SMB1, so we need to check after that call.

Fix the zero-length string check to look at state->smb_fname->base_name
instead of state->orig_path.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/smbd/filename.c

index 174b7b97dc3ba1fa8aa5aba7f18949788b999e67..daa4d9c3faa1ec4c9a0711360419035d3a433872 100644 (file)
@@ -990,6 +990,19 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
                return NT_STATUS_OBJECT_NAME_INVALID;
        }
 
+       /* Start with the full orig_path as given by the caller. */
+       if (!(state->smb_fname->base_name = talloc_strdup(state->smb_fname, state->orig_path))) {
+               DBG_ERR("talloc_strdup failed\n");
+               status = NT_STATUS_NO_MEMORY;
+               goto err;
+       }
+
+       /* Canonicalize any @GMT- paths. */
+       status = canonicalize_snapshot_path(state->smb_fname, ucf_flags, twrp);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto err;
+       }
+
        /*
         * If we trimmed down to a single '\0' character
         * then we should use the "." directory to avoid
@@ -998,7 +1011,7 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
         * As we know this is valid we can return true here.
         */
 
-       if (!*state->orig_path) {
+       if (state->smb_fname->base_name[0] == '\0') {
                if (!(state->smb_fname->base_name = talloc_strdup(state->smb_fname, "."))) {
                        status = NT_STATUS_NO_MEMORY;
                        goto err;
@@ -1025,19 +1038,6 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
                goto err;
        }
 
-       /* Start with the full orig_path as given by the caller. */
-       if (!(state->smb_fname->base_name = talloc_strdup(state->smb_fname, state->orig_path))) {
-               DBG_ERR("talloc_strdup failed\n");
-               status = NT_STATUS_NO_MEMORY;
-               goto err;
-       }
-
-       /* Canonicalize any @GMT- paths. */
-       status = canonicalize_snapshot_path(state->smb_fname, ucf_flags, twrp);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto err;
-       }
-
        /*
         * Large directory fix normalization. If we're case sensitive, and
         * the case preserving parameters are set to "no", normalize the case of