From: Ralph Boehme Date: Fri, 8 Apr 2022 09:44:28 +0000 (+0200) Subject: smbd: factor out reference_smb_fname_fsp_link() from parent_pathref() X-Git-Tag: talloc-2.4.0~385 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d1dd3f3d73fd283e4817ddc76d3687ed2e9933d0;p=thirdparty%2Fsamba.git smbd: factor out reference_smb_fname_fsp_link() from parent_pathref() Pair-Programmed-With: Stefan Metzmacher Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison --- diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 1b486757506..a52ef517e8d 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -1172,6 +1172,39 @@ NTSTATUS move_smb_fname_fsp_link(struct smb_filename *smb_fname_dst, return NT_STATUS_OK; } +static int fsp_ref_no_close_destructor(struct smb_filename *smb_fname) +{ + destroy_fsp_smb_fname_link(&smb_fname->fsp_link); + return 0; +} + +NTSTATUS reference_smb_fname_fsp_link(struct smb_filename *smb_fname_dst, + const struct smb_filename *smb_fname_src) +{ + NTSTATUS status; + + /* + * The target should always not be linked yet! + */ + SMB_ASSERT(smb_fname_dst->fsp == NULL); + SMB_ASSERT(smb_fname_dst->fsp_link == NULL); + + if (smb_fname_src->fsp == NULL) { + return NT_STATUS_OK; + } + + status = fsp_smb_fname_link(smb_fname_src->fsp, + &smb_fname_dst->fsp_link, + &smb_fname_dst->fsp); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + talloc_set_destructor(smb_fname_dst, fsp_ref_no_close_destructor); + + return NT_STATUS_OK; +} + /** * Create an smb_fname and open smb_fname->fsp pathref **/ @@ -1209,12 +1242,6 @@ NTSTATUS synthetic_pathref(TALLOC_CTX *mem_ctx, return NT_STATUS_OK; } -static int atname_destructor(struct smb_filename *smb_fname) -{ - destroy_fsp_smb_fname_link(&smb_fname->fsp_link); - return 0; -} - /** * Turn a path into a parent pathref and atname * @@ -1258,16 +1285,12 @@ NTSTATUS parent_pathref(TALLOC_CTX *mem_ctx, return status; } - if (smb_fname->fsp != NULL) { - status = fsp_smb_fname_link(smb_fname->fsp, - &atname->fsp_link, - &atname->fsp); - if (!NT_STATUS_IS_OK(status)) { - TALLOC_FREE(parent); - return status; - } - talloc_set_destructor(atname, atname_destructor); + status = reference_smb_fname_fsp_link(atname, smb_fname); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(parent); + return status; } + *_parent = parent; *_atname = atname; return NT_STATUS_OK; diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 9335ae476f7..cbf2cfc1d85 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -465,6 +465,9 @@ void smb_fname_fsp_unlink(struct smb_filename *smb_fname); NTSTATUS move_smb_fname_fsp_link(struct smb_filename *smb_fname_dst, struct smb_filename *smb_fname_src); +NTSTATUS reference_smb_fname_fsp_link(struct smb_filename *smb_fname_dst, + const struct smb_filename *smb_fname_src); + NTSTATUS synthetic_pathref(TALLOC_CTX *mem_ctx, struct files_struct *dirfsp, const char *base_name,