From 4c497c773156111e8fd12ab8573cf78d62823218 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Tue, 28 Apr 2020 16:40:25 +0200 Subject: [PATCH] smbd: use parent_smb_fname() in non_widelink_open() Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison --- source3/smbd/open.c | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/source3/smbd/open.c b/source3/smbd/open.c index d2ca2b1c50f..4d273aa930a 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -597,54 +597,48 @@ static int non_widelink_open(struct connection_struct *conn, struct smb_filename *smb_fname_rel = NULL; int saved_errno = 0; struct smb_filename *oldwd_fname = NULL; - char *parent_dir = NULL; - struct smb_filename parent_dir_fname = {0}; - const char *final_component = NULL; + struct smb_filename *parent_dir_fname = NULL; bool ok; if (fsp->fsp_flags.is_directory) { - parent_dir = talloc_strdup(talloc_tos(), smb_fname->base_name); - if (parent_dir == NULL) { + parent_dir_fname = cp_smb_filename(talloc_tos(), smb_fname); + if (parent_dir_fname == NULL) { saved_errno = errno; goto out; } - final_component = "."; + smb_fname_rel = synthetic_smb_fname(parent_dir_fname, + ".", + smb_fname->stream_name, + &smb_fname->st, + smb_fname->flags); + if (smb_fname_rel == NULL) { + saved_errno = errno; + goto out; + } } else { - ok = parent_dirname(talloc_tos(), - smb_fname->base_name, - &parent_dir, - &final_component); + ok = parent_smb_fname(talloc_tos(), + smb_fname, + &parent_dir_fname, + &smb_fname_rel); if (!ok) { saved_errno = errno; goto out; } } - parent_dir_fname = (struct smb_filename) { .base_name = parent_dir }; - oldwd_fname = vfs_GetWd(talloc_tos(), conn); if (oldwd_fname == NULL) { goto out; } /* Pin parent directory in place. */ - if (vfs_ChDir(conn, &parent_dir_fname) == -1) { - goto out; - } - - smb_fname_rel = synthetic_smb_fname(talloc_tos(), - final_component, - smb_fname->stream_name, - &smb_fname->st, - smb_fname->flags); - if (smb_fname_rel == NULL) { - saved_errno = ENOMEM; + if (vfs_ChDir(conn, parent_dir_fname) == -1) { goto out; } /* Ensure the relative path is below the share. */ - status = check_reduced_name(conn, &parent_dir_fname, smb_fname_rel); + status = check_reduced_name(conn, parent_dir_fname, smb_fname_rel); if (!NT_STATUS_IS_OK(status)) { saved_errno = map_errno_from_nt_status(status); goto out; @@ -710,8 +704,7 @@ static int non_widelink_open(struct connection_struct *conn, out: - TALLOC_FREE(parent_dir); - TALLOC_FREE(smb_fname_rel); + TALLOC_FREE(parent_dir_fname); if (oldwd_fname != NULL) { int ret = vfs_ChDir(conn, oldwd_fname); -- 2.47.3