]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: smbd: Preserve the fsp->fsp_name->st buf across a MSG_SMB_FILE_RENAME message.
authorJeremy Allison <jra@samba.org>
Tue, 29 Mar 2022 01:39:55 +0000 (18:39 -0700)
committerRalph Boehme <slow@samba.org>
Wed, 30 Mar 2022 15:07:09 +0000 (15:07 +0000)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15038

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
Autobuild-User(master): Ralph Böhme <slow@samba.org>
Autobuild-Date(master): Wed Mar 30 15:07:09 UTC 2022 on sn-devel-184

source3/smbd/open.c

index 9e792a23132fd14ec68087fdc44409b6508b8ba3..00d8f414c3abd8142b516ecce81c8333468c2ec8 100644 (file)
@@ -4887,16 +4887,36 @@ void msg_file_was_renamed(struct messaging_context *msg_ctx,
        }
 
        if (strcmp(fsp->conn->connectpath, msg->servicepath) == 0) {
+               SMB_STRUCT_STAT fsp_orig_sbuf;
                NTSTATUS status;
                DBG_DEBUG("renaming file %s from %s -> %s\n",
                          fsp_fnum_dbg(fsp),
                          fsp_str_dbg(fsp),
                          smb_fname_str_dbg(smb_fname));
+
+               /*
+                * The incoming smb_fname here has an
+                * invalid stat struct from synthetic_smb_fname()
+                * above.
+                * Preserve the existing stat from the
+                * open fsp after fsp_set_smb_fname()
+                * overwrites with the invalid stat.
+                *
+                * (We could just copy this into
+                * smb_fname->st, but keep this code
+                * identical to the fix in rename_open_files()
+                * for clarity.
+                *
+                * We will do an fstat before returning
+                * any of this metadata to the client anyway.
+                */
+               fsp_orig_sbuf = fsp->fsp_name->st;
                status = fsp_set_smb_fname(fsp, smb_fname);
                if (!NT_STATUS_IS_OK(status)) {
                        DBG_DEBUG("fsp_set_smb_fname failed: %s\n",
                                  nt_errstr(status));
                }
+               fsp->fsp_name->st = fsp_orig_sbuf;
        } else {
                /* TODO. JRA. */
                /*