]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: Factor out filename_convert_dirfsp_rel()
authorVolker Lendecke <vl@samba.org>
Fri, 11 Oct 2024 09:58:51 +0000 (11:58 +0200)
committerRalph Boehme <slow@samba.org>
Tue, 12 Nov 2024 18:07:33 +0000 (18:07 +0000)
Soon we'll have a caller that needs the last component as a relative
file name. Make sure it does not have to call get_lcomp or so.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/include/proto.h
source3/smbd/filename.c

index f398106e5a2f4eb24a2a588b5105b0c020505772..ee28afa6a566ac1d88ef44208fd380db44e2abb5 100644 (file)
@@ -713,6 +713,15 @@ NTSTATUS safe_symlink_target_path(TALLOC_CTX *mem_ctx,
                                  const char *target,
                                  size_t unparsed,
                                  char **_relative);
+NTSTATUS filename_convert_dirfsp_rel(TALLOC_CTX *mem_ctx,
+                                    connection_struct *conn,
+                                    struct files_struct *basedir,
+                                    const char *name_in,
+                                    uint32_t ucf_flags,
+                                    NTTIME twrp,
+                                    struct files_struct **_dirfsp,
+                                    struct smb_filename **_smb_fname,
+                                    struct smb_filename **_smb_fname_rel);
 NTSTATUS filename_convert_dirfsp(
        TALLOC_CTX *ctx,
        connection_struct *conn,
index 6884802a74bbdd992926d0fc337270e160868b90..d5804e2e15a8b6e81e0801c40ec7efa5702d811a 100644 (file)
@@ -673,6 +673,7 @@ static NTSTATUS filename_convert_dirfsp_nosymlink(
        NTTIME twrp,
        struct files_struct **_dirfsp,
        struct smb_filename **_smb_fname,
+       struct smb_filename **_smb_fname_rel,
        struct reparse_data_buffer **_symlink_err)
 {
        struct smb_filename *smb_dirname = NULL;
@@ -1045,7 +1046,7 @@ done:
        *_symlink_err = symlink_err;
 
        smb_fname_fsp_unlink(smb_fname_rel);
-       TALLOC_FREE(smb_fname_rel);
+       *_smb_fname_rel = smb_fname_rel;
        return NT_STATUS_OK;
 
 fail:
@@ -1066,14 +1067,15 @@ fail:
        return status;
 }
 
-NTSTATUS filename_convert_dirfsp(
-       TALLOC_CTX *mem_ctx,
-       connection_struct *conn,
-       const char *name_in,
-       uint32_t ucf_flags,
-       NTTIME twrp,
-       struct files_struct **_dirfsp,
-       struct smb_filename **_smb_fname)
+NTSTATUS filename_convert_dirfsp_rel(TALLOC_CTX *mem_ctx,
+                                    connection_struct *conn,
+                                    struct files_struct *basedir,
+                                    const char *name_in,
+                                    uint32_t ucf_flags,
+                                    NTTIME twrp,
+                                    struct files_struct **_dirfsp,
+                                    struct smb_filename **_smb_fname,
+                                    struct smb_filename **_smb_fname_rel)
 {
        struct reparse_data_buffer *symlink_err = NULL;
        struct symlink_reparse_struct *lnk = NULL;
@@ -1091,17 +1093,20 @@ next:
 
        status = filename_convert_dirfsp_nosymlink(mem_ctx,
                                                   conn,
-                                                  conn->cwd_fsp,
+                                                  basedir,
                                                   name_in,
                                                   ucf_flags,
                                                   twrp,
                                                   _dirfsp,
                                                   _smb_fname,
+                                                  _smb_fname_rel,
                                                   &symlink_err);
 
        if (!NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
                return status;
        }
+       TALLOC_FREE(*_smb_fname_rel);
+
        lnk = &symlink_err->parsed.lnk;
 
        /*
@@ -1169,6 +1174,30 @@ next:
        goto next;
 }
 
+NTSTATUS filename_convert_dirfsp(TALLOC_CTX *ctx,
+                                connection_struct *conn,
+                                const char *name_in,
+                                uint32_t ucf_flags,
+                                NTTIME twrp,
+                                struct files_struct **_dirfsp,
+                                struct smb_filename **_smb_name)
+{
+       struct smb_filename *smb_fname_rel = NULL;
+       NTSTATUS status;
+
+       status = filename_convert_dirfsp_rel(ctx,
+                                            conn,
+                                            conn->cwd_fsp,
+                                            name_in,
+                                            ucf_flags,
+                                            twrp,
+                                            _dirfsp,
+                                            _smb_name,
+                                            &smb_fname_rel);
+       TALLOC_FREE(smb_fname_rel);
+       return status;
+}
+
 char *full_path_from_dirfsp_at_basename(TALLOC_CTX *mem_ctx,
                                        const struct files_struct *dirfsp,
                                        const char *at_base_name)