diff options
author | Ralph Boehme <slow@samba.org> | 2022-04-08 11:44:28 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2022-12-09 23:11:37 +0000 |
commit | d1dd3f3d73fd283e4817ddc76d3687ed2e9933d0 (patch) | |
tree | 4c3496cdd03fd2a22ef3d10533d387618fb6e8f2 /source3 | |
parent | 67042d95bb39fe4b479fa952eec0ae1c1c82ebd6 (diff) | |
download | samba-d1dd3f3d73fd283e4817ddc76d3687ed2e9933d0.tar.gz |
smbd: factor out reference_smb_fname_fsp_link() from parent_pathref()
Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/files.c | 53 | ||||
-rw-r--r-- | source3/smbd/proto.h | 3 |
2 files changed, 41 insertions, 15 deletions
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, |