summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorRalph Boehme <slow@samba.org>2022-04-08 11:44:28 +0200
committerJeremy Allison <jra@samba.org>2022-12-09 23:11:37 +0000
commitd1dd3f3d73fd283e4817ddc76d3687ed2e9933d0 (patch)
tree4c3496cdd03fd2a22ef3d10533d387618fb6e8f2 /source3
parent67042d95bb39fe4b479fa952eec0ae1c1c82ebd6 (diff)
downloadsamba-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.c53
-rw-r--r--source3/smbd/proto.h3
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,