From b05b13ccec89496eae5ad29ab9e42c3ea7bedaed Mon Sep 17 00:00:00 2001 From: Noel Power Date: Thu, 18 Feb 2021 11:05:34 +0000 Subject: [PATCH] s3/smb3: ensure file_set_dosmode is passed valid smb_fname->fsp Signed-off-by: Noel Power Reviewed-by: Jeremy Allison --- source3/smbd/nttrans.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index ab933bcc520..86426c36042 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -1555,6 +1555,7 @@ static NTSTATUS copy_internals(TALLOC_CTX *ctx, off_t ret=-1; NTSTATUS status = NT_STATUS_OK; struct smb_filename *parent = NULL; + struct smb_filename *pathref = NULL; bool ok; if (!CAN_WRITE(conn)) { @@ -1671,7 +1672,26 @@ static NTSTATUS copy_internals(TALLOC_CTX *ctx, status = NT_STATUS_NO_MEMORY; goto out; } - file_set_dosmode(conn, smb_fname_dst, fattr, parent, false); + if (smb_fname_dst->fsp == NULL) { + status = synthetic_pathref(parent, + conn->cwd_fsp, + smb_fname_dst->base_name, + smb_fname_dst->stream_name, + NULL, + smb_fname_dst->twrp, + smb_fname_dst->flags, + &pathref); + + /* should we handle NT_STATUS_OBJECT_NAME_NOT_FOUND specially here ???? */ + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(parent); + goto out; + } + file_set_dosmode(conn, pathref, fattr, parent, false); + smb_fname_dst->st.st_ex_mode = pathref->st.st_ex_mode; + } else { + file_set_dosmode(conn, smb_fname_dst, fattr, parent, false); + } TALLOC_FREE(parent); if (ret < (off_t)smb_fname_src->st.st_ex_size) { -- 2.47.3