From: Noel Power Date: Thu, 18 Feb 2021 11:04:55 +0000 (+0000) Subject: s3/smb3: ensure file_set_dosmode is passed valid smb_fname->fsp X-Git-Tag: tevent-0.11.0~1590 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=470b6223e7283ce1308e0b273eb893d20ab72d5b;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/reply.c b/source3/smbd/reply.c index 45a2a298f65..5190e60b3f4 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -7582,6 +7582,7 @@ NTSTATUS rename_internals_fsp(connection_struct *conn, status = NT_STATUS_NO_MEMORY; goto out; } + if (smb_fname_dst_in) /* * Check for special case with case preserving and not @@ -7824,23 +7825,33 @@ NTSTATUS rename_internals_fsp(connection_struct *conn, (lp_map_archive(SNUM(conn)) || lp_store_dos_attributes(SNUM(conn)))) { - /* - * We must set the archive bit on the newly renamed - * file. - */ - ret = SMB_VFS_FSTAT(fsp, &smb_fname_dst->st); - if (ret == 0) { - uint32_t old_dosmode; - - fsp->fsp_name->st = smb_fname_dst->st; - old_dosmode = fdos_mode(fsp); - - file_set_dosmode(conn, - smb_fname_dst, - old_dosmode | FILE_ATTRIBUTE_ARCHIVE, - NULL, - true); + struct smb_filename *pathref = NULL; + status = synthetic_pathref(ctx, + conn->cwd_fsp, + smb_fname_dst->base_name, + smb_fname_dst->stream_name, + NULL, + smb_fname_dst->twrp, + smb_fname_dst->flags, + &pathref); + if (NT_STATUS_IS_OK(status)) { + /* + * We must set the archive bit on the newly renamed + * file. + */ + ret = SMB_VFS_FSTAT(fsp, &pathref->st); + if (ret == 0) { + uint32_t old_dosmode; + fsp->fsp_name->st = pathref->st; + old_dosmode = fdos_mode(fsp); + file_set_dosmode(conn, + pathref, + old_dosmode | FILE_ATTRIBUTE_ARCHIVE, + NULL, + true); + } } + TALLOC_FREE(pathref); } /*