The branch, master has been updated
       via  b0f28dcd7a3 s3: smbd: Remove parent_smb_fname(), no longer used.
       via  50a6da636c5 s3: smbd: check_reduced_name(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
       via  7dc7a2c0482 s3: smbd: check_reduced_name_with_privilege(), 
parent_smb_fname() -> SMB_VFS_PARENT_PATHNAME().
       via  2e41ffe1045 s3: smbd: parent_dirname_compatible_open(), 
parent_smb_fname() -> SMB_VFS_PARENT_PATHNAME().
       via  6263338f455 s3: smbd: non_widelink_open(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
       via  0dc842b4fab s3: smbd: In inherit_new_acl(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
       via  4f5928d286d s3: smbd: open_file_ntcreate(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
       via  38410ea2f7e s3: smbd: In check_parent_access(), parent_smb_fname() 
-> SMB_VFS_PARENT_PATHNAME().
       via  0dde001c369 s3: smbd: copy_internals(). parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
       via  b2027f982fe s3: smbd: In parent_pathref(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
       via  ad99ee75785 s3: smbd: In can_delete_file_in_directory(), 
parent_smb_fname() -> SMB_VFS_PARENT_PATHNAME().
       via  97c12be097f s3: VFS: linux_xfs_sgid. parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
       via  fb5749fa6b4 s3: VFS: gpfs. parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
       via  d0e84e28bfc s3: VFS: error_inject. parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
       via  9cd853da6bf s3: VFS: acl_common. parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
       via  71f69b6c1cc s3: VFS: shadow_copy2. Implement 
SMB_VFS_PARENT_PATHNAME().
       via  0e75f9ffabc s3: VFS: Add SMB_VFS_PARENT_PATHNAME().
       via  c500d99e2f5 s3: lib: Fix talloc heirarcy error in 
parent_smb_fname().
      from  58b5513d523 selftest: standardise and shorten winbind socket name

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit b0f28dcd7a32447ec55cce457664ef112baf2a7d
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:51:38 2021 -0700

    s3: smbd: Remove parent_smb_fname(), no longer used.
    
    Moved into the VFS as SMB_VFS_PARENT_PATHNAME() to
    allow modules to process the returned parent dirname.
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    
    Autobuild-User(master): Ralph Böhme <s...@samba.org>
    Autobuild-Date(master): Wed Jun  2 06:30:36 UTC 2021 on sn-devel-184

commit 50a6da636c59d5cd3af269828e201efae7eedb47
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:50:23 2021 -0700

    s3: smbd: check_reduced_name(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 7dc7a2c04823e8a472b51d1728c840d7c88bd961
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:47:36 2021 -0700

    s3: smbd: check_reduced_name_with_privilege(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 2e41ffe104579b0e7f5d09a2f02fb3b8e2b00d83
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:45:42 2021 -0700

    s3: smbd: parent_dirname_compatible_open(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 6263338f45598b8fb2a712dab562b5458a7e69d3
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:43:16 2021 -0700

    s3: smbd: non_widelink_open(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 0dc842b4fab43c025ef79814684dbf33e936c972
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 12:17:29 2021 -0700

    s3: smbd: In inherit_new_acl(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 4f5928d286d5afd1ba2277f51de99ee637f3a07b
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 12:13:40 2021 -0700

    s3: smbd: open_file_ntcreate(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 38410ea2f7e19e0e4586d7a5c5453658edde6007
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 12:11:36 2021 -0700

    s3: smbd: In check_parent_access(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 0dde001c369743c3a5078134461f98c1eee471fa
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:40:32 2021 -0700

    s3: smbd: copy_internals(). parent_smb_fname() -> SMB_VFS_PARENT_PATHNAME().
    
    Off-topic. This function is insane and should be removed..
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit b2027f982fe49023baca36101451e38df0b898c6
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:22:00 2021 -0700

    s3: smbd: In parent_pathref(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit ad99ee7578558358a79e748d53402fcc66ae72c3
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:10:53 2021 -0700

    s3: smbd: In can_delete_file_in_directory(), parent_smb_fname() -> 
SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 97c12be097f5b26fdcc2ee50da1d169ddce7731b
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:07:53 2021 -0700

    s3: VFS: linux_xfs_sgid. parent_smb_fname() -> SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit fb5749fa6b417c89cc8a150f00a79dbb46e23d42
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:05:32 2021 -0700

    s3: VFS: gpfs. parent_smb_fname() -> SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit d0e84e28bfc6b8ed0cc44bcc9cf6f021e633895e
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:03:25 2021 -0700

    s3: VFS: error_inject. parent_smb_fname() -> SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 9cd853da6bf3e942f5f3c8bee1d4e13ba99e4b06
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 11:00:49 2021 -0700

    s3: VFS: acl_common. parent_smb_fname() -> SMB_VFS_PARENT_PATHNAME().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 71f69b6c1cc836b33159ddb8716a5e73ef83a90b
Author: Jeremy Allison <j...@samba.org>
Date:   Tue Jun 1 11:58:55 2021 -0700

    s3: VFS: shadow_copy2. Implement SMB_VFS_PARENT_PATHNAME().
    
    Allows the snapdirseverywhere code to still find
    snapshots even when not in the parent path.
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 0e75f9ffabc751231e80f9583837f6afbc2d6233
Author: Jeremy Allison <j...@samba.org>
Date:   Wed May 26 10:39:43 2021 -0700

    s3: VFS: Add SMB_VFS_PARENT_PATHNAME().
    
    Not yet used.
    
    Default is NTSTATUS version of parent_smb_fname(). Now
    to replace all users of parent_smb_fname() with
    SMB_VFS_PARENT_PATHNAME() and then remove parent_smb_fname().
    
    Needed due to snapdirseverywhere code in vfs_shadow_copy2.
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit c500d99e2f5aaec102bf952b7941a2596b3e35a1
Author: Jeremy Allison <j...@samba.org>
Date:   Tue Jun 1 13:27:47 2021 -0700

    s3: lib: Fix talloc heirarcy error in parent_smb_fname().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14722
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 examples/VFS/skel_opaque.c            | 10 ++++
 examples/VFS/skel_transparent.c       | 14 +++++
 source3/include/proto.h               |  4 --
 source3/include/vfs.h                 | 17 ++++++
 source3/include/vfs_macros.h          |  5 ++
 source3/lib/filename_util.c           | 63 ----------------------
 source3/modules/vfs_acl_common.c      | 15 +++---
 source3/modules/vfs_default.c         | 65 +++++++++++++++++++++++
 source3/modules/vfs_error_inject.c    | 11 ++--
 source3/modules/vfs_full_audit.c      | 25 +++++++++
 source3/modules/vfs_gpfs.c            | 15 +++---
 source3/modules/vfs_linux_xfs_sgid.c  | 13 +++--
 source3/modules/vfs_not_implemented.c | 10 ++++
 source3/modules/vfs_shadow_copy2.c    | 98 +++++++++++++++++++++++++++++++++++
 source3/modules/vfs_time_audit.c      | 29 +++++++++++
 source3/smbd/file_access.c            |  9 +++-
 source3/smbd/files.c                  | 14 ++---
 source3/smbd/nttrans.c                | 13 +++--
 source3/smbd/open.c                   | 49 ++++++++++--------
 source3/smbd/reply.c                  | 15 +++---
 source3/smbd/vfs.c                    | 47 +++++++++++------
 21 files changed, 390 insertions(+), 151 deletions(-)


Changeset truncated at 500 lines:

diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c
index 487919f38a8..4ac5e61f1ff 100644
--- a/examples/VFS/skel_opaque.c
+++ b/examples/VFS/skel_opaque.c
@@ -684,6 +684,15 @@ static NTSTATUS skel_translate_name(struct 
vfs_handle_struct *handle,
        return NT_STATUS_NOT_IMPLEMENTED;
 }
 
+static NTSTATUS skel_parent_pathname(struct vfs_handle_struct *handle,
+                                    TALLOC_CTX *mem_ctx,
+                                    const struct smb_filename *smb_fname_in,
+                                    struct smb_filename **parent_dir_out,
+                                    struct smb_filename **atname_out)
+{
+       return NT_STATUS_NOT_IMPLEMENTED;
+}
+
 static NTSTATUS skel_fsctl(struct vfs_handle_struct *handle,
                           struct files_struct *fsp,
                           TALLOC_CTX *ctx,
@@ -1063,6 +1072,7 @@ static struct vfs_fn_pointers skel_opaque_fns = {
        .brl_unlock_windows_fn = skel_brl_unlock_windows,
        .strict_lock_check_fn = skel_strict_lock_check,
        .translate_name_fn = skel_translate_name,
+       .parent_pathname_fn = skel_parent_pathname,
        .fsctl_fn = skel_fsctl,
        .freaddir_attr_fn = skel_freaddir_attr,
        .audit_file_fn = skel_audit_file,
diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c
index a0a747d8b57..9138bde0872 100644
--- a/examples/VFS/skel_transparent.c
+++ b/examples/VFS/skel_transparent.c
@@ -898,6 +898,19 @@ static NTSTATUS skel_translate_name(struct 
vfs_handle_struct *handle,
                                           mem_ctx, pmapped_name);
 }
 
+static NTSTATUS skel_parent_pathname(struct vfs_handle_struct *handle,
+                                    TALLOC_CTX *mem_ctx,
+                                    const struct smb_filename *smb_fname_in,
+                                    struct smb_filename **parent_dir_out,
+                                    struct smb_filename **atname_out)
+{
+       return SMB_VFS_NEXT_PARENT_PATHNAME(handle,
+                                           mem_ctx,
+                                           smb_fname_in,
+                                           parent_dir_out,
+                                           atname_out);
+}
+
 static NTSTATUS skel_fsctl(struct vfs_handle_struct *handle,
                           struct files_struct *fsp,
                           TALLOC_CTX *ctx,
@@ -1368,6 +1381,7 @@ static struct vfs_fn_pointers skel_transparent_fns = {
        .brl_unlock_windows_fn = skel_brl_unlock_windows,
        .strict_lock_check_fn = skel_strict_lock_check,
        .translate_name_fn = skel_translate_name,
+       .parent_pathname_fn = skel_parent_pathname,
        .fsctl_fn = skel_fsctl,
        .freaddir_attr_fn = skel_freaddir_attr,
        .audit_file_fn = skel_audit_file,
diff --git a/source3/include/proto.h b/source3/include/proto.h
index f9bffb3aa59..d33cccd8390 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -376,10 +376,6 @@ char *myhostname_upper(void);
 #include "lib/util_path.h"
 bool parent_dirname(TALLOC_CTX *mem_ctx, const char *dir, char **parent,
                    const char **name);
-bool parent_smb_fname(TALLOC_CTX *mem_ctx,
-                     const struct smb_filename *path,
-                     struct smb_filename **_parent,
-                     struct smb_filename  **_name);
 bool ms_has_wild(const char *s);
 bool ms_has_wild_w(const smb_ucs2_t *s);
 bool mask_match(const char *string, const char *pattern, bool 
is_case_sensitive);
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 02293c64733..0f01da81148 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -354,6 +354,7 @@
  * Version 45 - Remove SMB_VFS_READDIR_ATTR
  * Version 45 - Add SMB_VFS_SYS_ACL_DELETE_DEF_FD
  * Version 45 - Remove SMB_VFS_SYS_ACL_DELETE_DEF_FILE
+ * Version 45 - Add SMB_VFS_PARENT_PATHNAME
  */
 
 #define SMB_VFS_INTERFACE_VERSION 45
@@ -1150,6 +1151,12 @@ struct vfs_fn_pointers {
                                      TALLOC_CTX *mem_ctx,
                                      char **mapped_name);
 
+       NTSTATUS (*parent_pathname_fn)(struct vfs_handle_struct *handle,
+                                      TALLOC_CTX *mem_ctx,
+                                      const struct smb_filename *smb_fname_in,
+                                      struct smb_filename **parent_dir_out,
+                                      struct smb_filename **atname_out);
+
        NTSTATUS (*fsctl_fn)(struct vfs_handle_struct *handle,
                             struct files_struct *fsp,
                             TALLOC_CTX *ctx,
@@ -1616,6 +1623,11 @@ NTSTATUS smb_vfs_call_translate_name(struct 
vfs_handle_struct *handle,
                                     enum vfs_translate_direction direction,
                                     TALLOC_CTX *mem_ctx,
                                     char **mapped_name);
+NTSTATUS smb_vfs_call_parent_pathname(struct vfs_handle_struct *handle,
+                                     TALLOC_CTX *mem_ctx,
+                                     const struct smb_filename *smb_fname_in,
+                                     struct smb_filename **parent_dir_out,
+                                     struct smb_filename **atname_out);
 NTSTATUS smb_vfs_call_fsctl(struct vfs_handle_struct *handle,
                            struct files_struct *fsp,
                            TALLOC_CTX *ctx,
@@ -2075,6 +2087,11 @@ NTSTATUS vfs_not_implemented_translate_name(struct 
vfs_handle_struct *handle,
                                            const char *mapped_name,
                                            enum vfs_translate_direction 
direction,
                                            TALLOC_CTX *mem_ctx, char 
**pmapped_name);
+NTSTATUS vfs_not_implemented_parent_pathname(struct vfs_handle_struct *handle,
+                                            TALLOC_CTX *mem_ctx,
+                                            const struct smb_filename 
*smb_fname_in,
+                                            struct smb_filename 
**parent_dir_out,
+                                            struct smb_filename **atname_out);
 NTSTATUS vfs_not_implemented_fsctl(struct vfs_handle_struct *handle,
                                   struct files_struct *fsp,
                                   TALLOC_CTX *ctx,
diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h
index 018d60ce914..71492b4db79 100644
--- a/source3/include/vfs_macros.h
+++ b/source3/include/vfs_macros.h
@@ -388,6 +388,11 @@
 #define SMB_VFS_NEXT_TRANSLATE_NAME(handle, name, direction, mem_ctx, 
mapped_name) \
        smb_vfs_call_translate_name((handle)->next, (name), (direction), 
(mem_ctx), (mapped_name))
 
+#define SMB_VFS_PARENT_PATHNAME(conn, mem_ctx, smb_fname_in, parent_dir_out, 
atname_out) \
+       smb_vfs_call_parent_pathname((conn)->vfs_handles, (mem_ctx), 
(smb_fname_in), (parent_dir_out), (atname_out))
+#define SMB_VFS_NEXT_PARENT_PATHNAME(handle, mem_ctx, smb_fname_in, 
parent_dir_out, atname_out) \
+       smb_vfs_call_parent_pathname((handle)->next, (mem_ctx), (smb_fname_in), 
(parent_dir_out), (atname_out))
+
 #define SMB_VFS_FSCTL(fsp, ctx, function, req_flags, in_data, in_len, 
out_data, max_out_len, out_len) \
        smb_vfs_call_fsctl((fsp)->conn->vfs_handles, (fsp), (ctx), (function), 
(req_flags), (in_data), (in_len), (out_data), (max_out_len), (out_len))
 
diff --git a/source3/lib/filename_util.c b/source3/lib/filename_util.c
index f535ea1f088..120d2ecc4bc 100644
--- a/source3/lib/filename_util.c
+++ b/source3/lib/filename_util.c
@@ -269,69 +269,6 @@ struct smb_filename *cp_smb_filename(TALLOC_CTX *mem_ctx,
        return out;
 }
 
-/**
- * Return allocated parent directory and basename of path
- *
- * Note: if requesting name, it is returned as talloc child of the
- * parent. Freeing the parent is thus sufficient to free both.
- */
-bool parent_smb_fname(TALLOC_CTX *mem_ctx,
-                     const struct smb_filename *path,
-                     struct smb_filename **_parent,
-                     struct smb_filename  **_name)
-{
-       TALLOC_CTX *frame = talloc_stackframe();
-       struct smb_filename *parent = NULL;
-       struct smb_filename *name = NULL;
-       char *p = NULL;
-
-       parent = cp_smb_filename(frame, path);
-       if (parent == NULL) {
-               TALLOC_FREE(frame);
-               return false;
-       }
-       TALLOC_FREE(parent->stream_name);
-       SET_STAT_INVALID(parent->st);
-
-       p = strrchr_m(parent->base_name, '/'); /* Find final '/', if any */
-       if (p == NULL) {
-               TALLOC_FREE(parent->base_name);
-               parent->base_name = talloc_strdup(parent, ".");
-               if (parent->base_name == NULL) {
-                       TALLOC_FREE(frame);
-                       return false;
-               }
-               p = path->base_name;
-       } else {
-               *p = '\0';
-               p++;
-       }
-
-       if (_name == NULL) {
-               *_parent = talloc_move(mem_ctx, &parent);
-               TALLOC_FREE(frame);
-               return true;
-       }
-
-       name = cp_smb_filename(frame, path);
-       if (name == NULL) {
-               TALLOC_FREE(frame);
-               return false;
-       }
-       TALLOC_FREE(name->base_name);
-
-       name->base_name = talloc_strdup(mem_ctx, p);
-       if (name == NULL) {
-               TALLOC_FREE(frame);
-               return false;
-       }
-
-       *_parent = talloc_move(mem_ctx, &parent);
-       *_name = talloc_move(*_parent, &name);
-       TALLOC_FREE(frame);
-       return true;
-}
-
 static void assert_valid_stream_smb_fname(const struct smb_filename *smb_fname)
 {
        /* stream_name must always be NULL if there is no stream. */
diff --git a/source3/modules/vfs_acl_common.c b/source3/modules/vfs_acl_common.c
index 39afdcb1cf3..0615c06c81b 100644
--- a/source3/modules/vfs_acl_common.c
+++ b/source3/modules/vfs_acl_common.c
@@ -1200,7 +1200,7 @@ static int acl_common_remove_object(vfs_handle_struct 
*handle,
        struct smb_filename *parent_dir_fname = NULL;
        int saved_errno = 0;
        struct smb_filename *saved_dir_fname = NULL;
-       bool ok;
+       NTSTATUS status;
 
        saved_dir_fname = vfs_GetWd(talloc_tos(),conn);
        if (saved_dir_fname == NULL) {
@@ -1215,12 +1215,13 @@ static int acl_common_remove_object(vfs_handle_struct 
*handle,
                goto out;
        }
 
-       ok = parent_smb_fname(talloc_tos(),
-                             full_fname,
-                             &parent_dir_fname,
-                             &local_fname);
-       if (!ok) {
-               saved_errno = ENOMEM;
+       status = SMB_VFS_PARENT_PATHNAME(conn,
+                                        talloc_tos(),
+                                        full_fname,
+                                        &parent_dir_fname,
+                                        &local_fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               saved_errno = map_errno_from_nt_status(status);
                goto out;
        }
 
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index e384f8885d1..77e709f2449 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -1325,6 +1325,70 @@ static NTSTATUS vfswrap_translate_name(struct 
vfs_handle_struct *handle,
        return NT_STATUS_NONE_MAPPED;
 }
 
+/**
+ * Return allocated parent directory and basename of path
+ *
+ * Note: if requesting name, it is returned as talloc child of the
+ * parent. Freeing the parent is thus sufficient to free both.
+ */
+static NTSTATUS vfswrap_parent_pathname(struct vfs_handle_struct *handle,
+                                       TALLOC_CTX *mem_ctx,
+                                       const struct smb_filename *smb_fname_in,
+                                       struct smb_filename **parent_dir_out,
+                                       struct smb_filename **atname_out)
+{
+       TALLOC_CTX *frame = talloc_stackframe();
+       struct smb_filename *parent = NULL;
+       struct smb_filename *name = NULL;
+       char *p = NULL;
+
+       parent = cp_smb_filename(frame, smb_fname_in);
+       if (parent == NULL) {
+               TALLOC_FREE(frame);
+               return NT_STATUS_NO_MEMORY;
+       }
+       TALLOC_FREE(parent->stream_name);
+       SET_STAT_INVALID(parent->st);
+
+       p = strrchr_m(parent->base_name, '/'); /* Find final '/', if any */
+       if (p == NULL) {
+               TALLOC_FREE(parent->base_name);
+               parent->base_name = talloc_strdup(parent, ".");
+               if (parent->base_name == NULL) {
+                       TALLOC_FREE(frame);
+                       return NT_STATUS_NO_MEMORY;
+               }
+               p = smb_fname_in->base_name;
+       } else {
+               *p = '\0';
+               p++;
+       }
+
+       if (atname_out == NULL) {
+               *parent_dir_out = talloc_move(mem_ctx, &parent);
+               TALLOC_FREE(frame);
+               return NT_STATUS_OK;
+       }
+
+       name = cp_smb_filename(frame, smb_fname_in);
+       if (name == NULL) {
+               TALLOC_FREE(frame);
+               return NT_STATUS_NO_MEMORY;
+       }
+       TALLOC_FREE(name->base_name);
+
+       name->base_name = talloc_strdup(name, p);
+       if (name->base_name == NULL) {
+               TALLOC_FREE(frame);
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       *parent_dir_out = talloc_move(mem_ctx, &parent);
+       *atname_out = talloc_move(*parent_dir_out, &name);
+       TALLOC_FREE(frame);
+       return NT_STATUS_OK;
+}
+
 /*
  * Implement the default fsctl operation.
  */
@@ -3824,6 +3888,7 @@ static struct vfs_fn_pointers vfs_default_fns = {
        .brl_unlock_windows_fn = vfswrap_brl_unlock_windows,
        .strict_lock_check_fn = vfswrap_strict_lock_check,
        .translate_name_fn = vfswrap_translate_name,
+       .parent_pathname_fn = vfswrap_parent_pathname,
        .fsctl_fn = vfswrap_fsctl,
        .fset_dos_attributes_fn = vfswrap_fset_dos_attributes,
        .get_dos_attributes_send_fn = vfswrap_get_dos_attributes_send,
diff --git a/source3/modules/vfs_error_inject.c 
b/source3/modules/vfs_error_inject.c
index 31257cc1d00..dca8783edaf 100644
--- a/source3/modules/vfs_error_inject.c
+++ b/source3/modules/vfs_error_inject.c
@@ -133,7 +133,7 @@ static int vfs_error_inject_unlinkat(struct 
vfs_handle_struct *handle,
        struct smb_filename *parent_fname = NULL;
        int error = inject_unix_error("unlinkat", handle);
        int ret;
-       bool ok;
+       NTSTATUS status;
 
        if (error == 0) {
                return SMB_VFS_NEXT_UNLINKAT(handle, dirfsp, smb_fname, flags);
@@ -146,9 +146,14 @@ static int vfs_error_inject_unlinkat(struct 
vfs_handle_struct *handle,
                return -1;
        }
 
-       ok = parent_smb_fname(full_fname, full_fname, &parent_fname, NULL);
-       if (!ok) {
+       status = SMB_VFS_PARENT_PATHNAME(handle->conn,
+                                        full_fname, /* TALLOC_CTX. */
+                                        full_fname,
+                                        &parent_fname,
+                                        NULL);
+       if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(full_fname);
+               errno = map_errno_from_nt_status(status);
                return -1;
        }
 
diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c
index 85ba9ef2418..32e7879f7da 100644
--- a/source3/modules/vfs_full_audit.c
+++ b/source3/modules/vfs_full_audit.c
@@ -170,6 +170,7 @@ typedef enum _vfs_op_type {
        SMB_VFS_OP_BRL_UNLOCK_WINDOWS,
        SMB_VFS_OP_STRICT_LOCK_CHECK,
        SMB_VFS_OP_TRANSLATE_NAME,
+       SMB_VFS_OP_PARENT_PATHNAME,
        SMB_VFS_OP_FSCTL,
        SMB_VFS_OP_OFFLOAD_READ_SEND,
        SMB_VFS_OP_OFFLOAD_READ_RECV,
@@ -309,6 +310,7 @@ static struct {
        { SMB_VFS_OP_BRL_UNLOCK_WINDOWS, "brl_unlock_windows" },
        { SMB_VFS_OP_STRICT_LOCK_CHECK, "strict_lock_check" },
        { SMB_VFS_OP_TRANSLATE_NAME,    "translate_name" },
+       { SMB_VFS_OP_PARENT_PATHNAME,   "parent_pathname" },
        { SMB_VFS_OP_FSCTL,             "fsctl" },
        { SMB_VFS_OP_OFFLOAD_READ_SEND, "offload_read_send" },
        { SMB_VFS_OP_OFFLOAD_READ_RECV, "offload_read_recv" },
@@ -2128,6 +2130,28 @@ static NTSTATUS smb_full_audit_translate_name(struct 
vfs_handle_struct *handle,
        return result;
 }
 
+static NTSTATUS smb_full_audit_parent_pathname(struct vfs_handle_struct 
*handle,
+                                              TALLOC_CTX *mem_ctx,
+                                              const struct smb_filename 
*smb_fname_in,
+                                              struct smb_filename 
**parent_dir_out,
+                                              struct smb_filename **atname_out)
+{
+       NTSTATUS result;
+
+       result = SMB_VFS_NEXT_PARENT_PATHNAME(handle,
+                                             mem_ctx,
+                                             smb_fname_in,
+                                             parent_dir_out,
+                                             atname_out);
+       do_log(SMB_VFS_OP_CONNECTPATH,
+              NT_STATUS_IS_OK(result),
+              handle,
+              "%s",
+              smb_fname_str_do_log(handle->conn, smb_fname_in));
+
+       return result;
+}
+
 static NTSTATUS smb_full_audit_fsctl(struct vfs_handle_struct *handle,
                                struct files_struct *fsp,
                                TALLOC_CTX *ctx,
@@ -2990,6 +3014,7 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
        .brl_unlock_windows_fn = smb_full_audit_brl_unlock_windows,
        .strict_lock_check_fn = smb_full_audit_strict_lock_check,
        .translate_name_fn = smb_full_audit_translate_name,
+       .parent_pathname_fn = smb_full_audit_parent_pathname,
        .fsctl_fn = smb_full_audit_fsctl,
        .get_dos_attributes_send_fn = smb_full_audit_get_dos_attributes_send,
        .get_dos_attributes_recv_fn = smb_full_audit_get_dos_attributes_recv,
diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c
index fa2fa81eec0..a05bb0f3c7a 100644
--- a/source3/modules/vfs_gpfs.c
+++ b/source3/modules/vfs_gpfs.c
@@ -1721,18 +1721,19 @@ static int stat_with_capability(struct 
vfs_handle_struct *handle,
 {
 #if defined(HAVE_FSTATAT)
        int fd = -1;
-       bool ok;
+       NTSTATUS status;
        struct smb_filename *dir_name = NULL;
        struct smb_filename *rel_name = NULL;
        struct stat st;
        int ret = -1;
 
-       ok = parent_smb_fname(talloc_tos(),
-                             smb_fname,
-                             &dir_name,
-                             &rel_name);
-       if (!ok) {
-               errno = ENOMEM;
+       status = SMB_VFS_PARENT_PATHNAME(handle->conn,
+                                        talloc_tos(),
+                                        smb_fname,
+                                        &dir_name,
+                                        &rel_name);
+       if (!NT_STATUS_IS_OK(status)) {
+               errno = map_errno_from_nt_status(status);
                return -1;
        }
 
diff --git a/source3/modules/vfs_linux_xfs_sgid.c 
b/source3/modules/vfs_linux_xfs_sgid.c
index 4f07ceab092..a08e2d40f83 100644
--- a/source3/modules/vfs_linux_xfs_sgid.c
+++ b/source3/modules/vfs_linux_xfs_sgid.c
@@ -31,7 +31,7 @@ static int linux_xfs_sgid_mkdirat(vfs_handle_struct *handle,
        struct smb_filename *fname = NULL;
        int mkdir_res;
        int res;
-       bool ok;
+       NTSTATUS status;
 
        DEBUG(10, ("Calling linux_xfs_sgid_mkdirat(%s)\n",
                smb_fname->base_name));
@@ -53,9 +53,14 @@ static int linux_xfs_sgid_mkdirat(vfs_handle_struct *handle,
                return -1;
        }
 
-       ok = parent_smb_fname(talloc_tos(), fname, &dname, NULL);
-       if (!ok) {
-               DBG_WARNING("parent_smb_fname() failed\n");
+       status = SMB_VFS_PARENT_PATHNAME(handle->conn,
+                                        talloc_tos(),
+                                        fname,
+                                        &dname,
+                                        NULL);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_WARNING("SMB_VFS_PARENT_PATHNAME() failed with %s\n",
+                       nt_errstr(status));
                /* return success, we did the mkdir */
                return mkdir_res;
        }
diff --git a/source3/modules/vfs_not_implemented.c 
b/source3/modules/vfs_not_implemented.c
index 9cde162c593..8b93b3444e2 100644
--- a/source3/modules/vfs_not_implemented.c
+++ b/source3/modules/vfs_not_implemented.c
@@ -687,6 +687,15 @@ NTSTATUS vfs_not_implemented_translate_name(struct 
vfs_handle_struct *handle,
        return NT_STATUS_NOT_IMPLEMENTED;
 }
 
+NTSTATUS vfs_not_implemented_parent_pathname(struct vfs_handle_struct *handle,
+                                                   TALLOC_CTX *mem_ctx,
+                                                   const struct smb_filename 
*smb_fname_in,
+                                                   struct smb_filename 
**parent_dir_out,
+                                                   struct smb_filename 
**atname_out)
+{
+       return NT_STATUS_NOT_IMPLEMENTED;
+}
+
 NTSTATUS vfs_not_implemented_fsctl(struct vfs_handle_struct *handle,
                                   struct files_struct *fsp,
                                   TALLOC_CTX *ctx,
@@ -1067,6 +1076,7 @@ static struct vfs_fn_pointers vfs_not_implemented_fns = {


-- 
Samba Shared Repository

Reply via email to