From: Ralph Boehme Date: Mon, 23 Nov 2020 06:46:42 +0000 (+0100) Subject: smbd: replace a stat() with an fstat() in create_file_unixpath() X-Git-Tag: samba-4.14.0rc1~335 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c21890d128d43f6f739051aff61436c9119ba5ab;p=thirdparty%2Fsamba.git smbd: replace a stat() with an fstat() in create_file_unixpath() Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison --- diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 47ee513e0a4..eef2e2faea9 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -5576,10 +5576,37 @@ static NTSTATUS create_file_unixpath(connection_struct *conn, goto fail; } - if (SMB_VFS_STAT(conn, smb_fname_base) == -1) { - DEBUG(10, ("Unable to stat stream: %s\n", - smb_fname_str_dbg(smb_fname_base))); - } else { + /* + * We may be creating the basefile as part of creating the + * stream, so it's legal if the basefile doesn't exist at this + * point, the create_file_unixpath() below will create it. But + * if the basefile exists we want a handle so we can fstat() it. + */ + status = openat_pathref_fsp(conn->cwd_fsp, smb_fname_base); + if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) { + status = NT_STATUS_OBJECT_NAME_NOT_FOUND; + } + if (!NT_STATUS_IS_OK(status) && + !NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) + { + DBG_ERR("open_smb_fname_fsp [%s] failed: %s\n", + smb_fname_str_dbg(smb_fname_base), + nt_errstr(status)); + TALLOC_FREE(smb_fname_base); + goto fail; + } + + if (smb_fname_base->fsp != NULL) { + int ret; + + ret = SMB_VFS_FSTAT(smb_fname_base->fsp, + &smb_fname_base->st); + if (ret != 0) { + DBG_DEBUG("Unable to stat stream [%s]: %s\n", + smb_fname_str_dbg(smb_fname_base), + strerror(errno)); + } + /* * https://bugzilla.samba.org/show_bug.cgi?id=10229 * We need to check if the requested access mask