]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: factor out reference_smb_fname_fsp_link() from parent_pathref()
authorRalph Boehme <slow@samba.org>
Fri, 8 Apr 2022 09:44:28 +0000 (11:44 +0200)
committerJeremy Allison <jra@samba.org>
Fri, 9 Dec 2022 23:11:37 +0000 (23:11 +0000)
Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/files.c
source3/smbd/proto.h

index 1b486757506da23bbf7fff3ca2e69e6df347be86..a52ef517e8dae41571ebb22d5f96a1ce63311889 100644 (file)
@@ -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;
index 9335ae476f7d3ab309fac07e4834878e0d257103..cbf2cfc1d851c02f5cbd3ad48156acf9b239af7d 100644 (file)
@@ -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,