From: Jeremy Allison Date: Mon, 1 Aug 2022 21:24:31 +0000 (-0700) Subject: s3: smbd: In filename_convert_dirfsp_nosymlink(), in SMB1-only POSIX mode, allow... X-Git-Tag: samba-4.17.0rc1~151 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5249cb3d0fdfe96c4bc65a6338d798feada590ec;p=thirdparty%2Fsamba.git s3: smbd: In filename_convert_dirfsp_nosymlink(), in SMB1-only POSIX mode, allow a pathname referencing a symlink to be returned. Doesn't contain a valid smb_fname->fsp pointer of course, and is only used by the SMB1 code to take a reference to a smylink name for manipulation (unlinkat, readlinkat etc.). Signed-off-by: Jeremy Allison Reviewed-by: Volker Lendecke --- diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index 27650326ade..a9a998db7c5 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -2907,6 +2907,28 @@ static NTSTATUS filename_convert_dirfsp_nosymlink( char *normalized = NULL; if (VALID_STAT(smb_fname_rel->st)) { +#if defined(WITH_SMB1SERVER) + /* + * In SMB1 posix mode, if this is a symlink, + * allow access to the name with a NULL smb_fname->fsp. + */ + if (!conn->sconn->using_smb2 && + posix && + S_ISLNK(smb_fname_rel->st.st_ex_mode)) { + SMB_ASSERT(smb_fname_rel->fsp == NULL); + SMB_ASSERT(streamname == NULL); + + smb_fname = full_path_from_dirfsp_atname( + mem_ctx, + smb_dirname->fsp, + smb_fname_rel); + if (smb_fname == NULL) { + status = NT_STATUS_NO_MEMORY; + goto fail; + } + goto done; + } +#endif /* * NT_STATUS_OBJECT_NAME_NOT_FOUND is * misleading: The object exists but might be