From 0cbb940080940830acdc4611f75075058fa0468b Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 10 Feb 2021 14:50:36 -0800 Subject: [PATCH] s3: smbd: Change smb_unix_read_symlink() to use a real directory fsp for SMB_VFS_READLINKAT(). Signed-off-by: Jeremy Allison Reviewed-by: Noel Power --- source3/smbd/trans2.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 7ac6204f9c4..f9ef056b736 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -4957,6 +4957,9 @@ static NTSTATUS smb_unix_read_symlink(connection_struct *conn, NTSTATUS status; size_t len = 0; int link_len = 0; + struct smb_filename *parent_fname = NULL; + struct smb_filename *base_name = NULL; + char *buffer = talloc_array(talloc_tos(), char, PATH_MAX+1); if (!buffer) { @@ -4971,12 +4974,24 @@ static NTSTATUS smb_unix_read_symlink(connection_struct *conn, return NT_STATUS_DOS(ERRSRV, ERRbadlink); } - link_len = SMB_VFS_READLINKAT(conn, + status = parent_pathref(talloc_tos(), conn->cwd_fsp, smb_fname, + &parent_fname, + &base_name); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(buffer); + return status; + } + + link_len = SMB_VFS_READLINKAT(conn, + parent_fname->fsp, + base_name, buffer, PATH_MAX); + TALLOC_FREE(parent_fname); + if (link_len == -1) { TALLOC_FREE(buffer); return map_nt_error_from_unix(errno);