From: Noel Power Date: Thu, 18 Feb 2021 11:05:34 +0000 (+0000) Subject: s3/smb3: ensure file_set_dosmode is passed valid smb_fname->fsp X-Git-Tag: tevent-0.11.0~1589 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b05b13ccec89496eae5ad29ab9e42c3ea7bedaed;p=thirdparty%2Fsamba.git s3/smb3: ensure file_set_dosmode is passed valid smb_fname->fsp Signed-off-by: Noel Power Reviewed-by: Jeremy Allison --- 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) {