The branch, master has been updated
       via  51c1a2a s3: VFS: Change SMB_VFS_CONNECTPATH to take const struct 
smb_filename * instead of const char *.
       via  a665ed4 S3: smbd: Finish plumbing struct smb_filename * through the 
check_name() stack.
       via  f2588ed s3: smbd: Add missing out of memory check.
       via  c29438f s3: VFS: Change SMB_VFS_REALPATH to take and return struct 
smb_filename * instead of char *.
       via  bd9285b s3: VFS: Change SMB_VFS_GETWD to return struct smb_filename 
* instead of char *.
       via  6acb0d6 s3: VFS: Change SMB_VFS_CHDIR to use const struct 
smb_filename * instead of const char *.
      from  73bee8b show-deleted: Rename attr_filter to exclude_filter for 
clarity

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


- Log -----------------------------------------------------------------
commit 51c1a2a45861c725f756f60ca05e6d1fa4ca34c6
Author: Jeremy Allison <[email protected]>
Date:   Fri Jun 30 13:37:03 2017 -0700

    s3: VFS: Change SMB_VFS_CONNECTPATH to take const struct smb_filename * 
instead of const char *.
    
    We need to migrate all pathname based VFS calls to use a struct
    to finish modernising the VFS with extra timestamp and flags parameters.
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Richard Sharpe <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Sat Jul  1 07:20:28 CEST 2017 on sn-devel-144

commit a665ed4eea92adba91195f8096c93a2dfd31dbe4
Author: Jeremy Allison <[email protected]>
Date:   Fri Jun 30 11:59:20 2017 -0700

    S3: smbd: Finish plumbing struct smb_filename * through the check_name() 
stack.
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Richard Sharpe <[email protected]>

commit f2588ed689b813d10034c117b02a3399df63ad4f
Author: Jeremy Allison <[email protected]>
Date:   Fri Jun 30 11:34:13 2017 -0700

    s3: smbd: Add missing out of memory check.
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Richard Sharpe <[email protected]>

commit c29438f8238c3cf436e126c99f6f9f6bcca4efaf
Author: Jeremy Allison <[email protected]>
Date:   Fri Jun 30 11:32:59 2017 -0700

    s3: VFS: Change SMB_VFS_REALPATH to take and return struct smb_filename * 
instead of char *.
    
    We need to migrate all pathname based VFS calls to use a struct
    to finish modernising the VFS with extra timestamp and flags parameters.
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Richard Sharpe <[email protected]>

commit bd9285b19741128bae501b721d9e63dd9a9bd833
Author: Jeremy Allison <[email protected]>
Date:   Thu Jun 29 14:32:47 2017 -0700

    s3: VFS: Change SMB_VFS_GETWD to return struct smb_filename * instead of 
char *.
    
    We need to migrate all pathname based VFS calls to use a struct
    to finish modernising the VFS with extra timestamp and flags parameters.
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Richard Sharpe <[email protected]>

commit 6acb0d6ca08d72f776d3ba9dc934261a481aa737
Author: Jeremy Allison <[email protected]>
Date:   Thu Jun 29 11:29:33 2017 -0700

    s3: VFS: Change SMB_VFS_CHDIR to use const struct smb_filename * instead of 
const char *.
    
    We need to migrate all pathname based VFS calls to use a struct
    to finish modernising the VFS with extra timestamp and flags parameters.
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Richard Sharpe <[email protected]>

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

Summary of changes:
 examples/VFS/skel_opaque.c                |  12 +-
 examples/VFS/skel_transparent.c           |  20 +--
 lib/util/memcache.c                       |   1 +
 source3/include/vfs.h                     |  36 +++--
 source3/include/vfs_macros.h              |  32 ++---
 source3/modules/vfs_acl_common.c          |  27 ++--
 source3/modules/vfs_cap.c                 |  62 +++++++-
 source3/modules/vfs_catia.c               |  50 +++++--
 source3/modules/vfs_ceph.c                |  37 +++--
 source3/modules/vfs_default.c             |  46 ++++--
 source3/modules/vfs_dirsort.c             |  10 +-
 source3/modules/vfs_fake_dfq.c            |  57 +++++---
 source3/modules/vfs_full_audit.c          |  36 ++---
 source3/modules/vfs_glusterfs.c           |  36 +++--
 source3/modules/vfs_media_harmony.c       |  60 ++++----
 source3/modules/vfs_netatalk.c            |  25 ++--
 source3/modules/vfs_preopen.c             |   3 +-
 source3/modules/vfs_shadow_copy2.c        | 105 ++++++++------
 source3/modules/vfs_snapper.c             |  84 +++++++----
 source3/modules/vfs_time_audit.c          |  37 +++--
 source3/modules/vfs_unityed_media.c       |  41 +++---
 source3/printing/nt_printing.c            |  21 +--
 source3/rpc_server/srvsvc/srv_srvsvc_nt.c |  31 ++--
 source3/smbd/dir.c                        |  23 +--
 source3/smbd/filename.c                   |  30 ++--
 source3/smbd/msdfs.c                      |  75 ++++++----
 source3/smbd/open.c                       | 150 ++++++++++++-------
 source3/smbd/proto.h                      |  20 ++-
 source3/smbd/reply.c                      |  46 +++---
 source3/smbd/service.c                    |  52 +++++--
 source3/smbd/vfs.c                        | 231 +++++++++++++++++-------------
 source3/torture/cmd_vfs.c                 |  21 ++-
 source3/torture/torture.c                 |  82 ++++++++---
 33 files changed, 1009 insertions(+), 590 deletions(-)


Changeset truncated at 500 lines:

diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c
index d5c468e..74ffb67 100644
--- a/examples/VFS/skel_opaque.c
+++ b/examples/VFS/skel_opaque.c
@@ -412,13 +412,15 @@ static int skel_lchown(vfs_handle_struct *handle,
        return -1;
 }
 
-static int skel_chdir(vfs_handle_struct *handle, const char *path)
+static int skel_chdir(vfs_handle_struct *handle,
+                       const struct smb_filename *smb_fname)
 {
        errno = ENOSYS;
        return -1;
 }
 
-static char *skel_getwd(vfs_handle_struct *handle)
+static struct smb_filename *skel_getwd(vfs_handle_struct *handle,
+                               TALLOC_CTX *ctx)
 {
        errno = ENOSYS;
        return NULL;
@@ -510,7 +512,9 @@ static int skel_mknod(vfs_handle_struct *handle,
        return -1;
 }
 
-static char *skel_realpath(vfs_handle_struct *handle, const char *path)
+static struct smb_filename *skel_realpath(vfs_handle_struct *handle,
+                       TALLOC_CTX *ctx,
+                       const struct smb_filename *smb_fname)
 {
        errno = ENOSYS;
        return NULL;
@@ -610,7 +614,7 @@ static int skel_get_real_filename(struct vfs_handle_struct 
*handle,
 }
 
 static const char *skel_connectpath(struct vfs_handle_struct *handle,
-                                   const char *filename)
+                               const struct smb_filename *smb_fname)
 {
        errno = ENOSYS;
        return NULL;
diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c
index 9387276..e584d51 100644
--- a/examples/VFS/skel_transparent.c
+++ b/examples/VFS/skel_transparent.c
@@ -515,14 +515,16 @@ static int skel_lchown(vfs_handle_struct *handle,
        return SMB_VFS_NEXT_LCHOWN(handle, smb_fname, uid, gid);
 }
 
-static int skel_chdir(vfs_handle_struct *handle, const char *path)
+static int skel_chdir(vfs_handle_struct *handle,
+                       const struct smb_filename *smb_fname)
 {
-       return SMB_VFS_NEXT_CHDIR(handle, path);
+       return SMB_VFS_NEXT_CHDIR(handle, smb_fname);
 }
 
-static char *skel_getwd(vfs_handle_struct *handle)
+static struct smb_filename *skel_getwd(vfs_handle_struct *handle,
+                                       TALLOC_CTX *ctx)
 {
-       return SMB_VFS_NEXT_GETWD(handle);
+       return SMB_VFS_NEXT_GETWD(handle, ctx);
 }
 
 static int skel_ntimes(vfs_handle_struct *handle,
@@ -600,9 +602,11 @@ static int skel_mknod(vfs_handle_struct *handle,
        return SMB_VFS_NEXT_MKNOD(handle, smb_fname, mode, dev);
 }
 
-static char *skel_realpath(vfs_handle_struct *handle, const char *path)
+static struct smb_filename *skel_realpath(vfs_handle_struct *handle,
+                       TALLOC_CTX *ctx,
+                       const struct smb_filename *smb_fname)
 {
-       return SMB_VFS_NEXT_REALPATH(handle, path);
+       return SMB_VFS_NEXT_REALPATH(handle, ctx, smb_fname);
 }
 
 static int skel_chflags(vfs_handle_struct *handle,
@@ -735,9 +739,9 @@ static int skel_get_real_filename(struct vfs_handle_struct 
*handle,
 }
 
 static const char *skel_connectpath(struct vfs_handle_struct *handle,
-                                   const char *filename)
+                               const struct smb_filename *smb_fname)
 {
-       return SMB_VFS_NEXT_CONNECTPATH(handle, filename);
+       return SMB_VFS_NEXT_CONNECTPATH(handle, smb_fname);
 }
 
 static NTSTATUS skel_brl_lock_windows(struct vfs_handle_struct *handle,
diff --git a/lib/util/memcache.c b/lib/util/memcache.c
index 9e9a208..acd663c 100644
--- a/lib/util/memcache.c
+++ b/lib/util/memcache.c
@@ -54,6 +54,7 @@ static bool memcache_is_talloc(enum memcache_number n)
        case PDB_GETPWSID_CACHE:
        case SINGLETON_CACHE_TALLOC:
        case SHARE_MODE_LOCK_CACHE:
+       case GETWD_CACHE:
                result = true;
                break;
        default:
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index db555f2..6a3f6c9 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -228,6 +228,16 @@
                to const struct smb_filename * */
 /* Version 37 - Change symlink from const char *
                to const struct smb_filename * */
+/* Version 37 - Change chdir from const char *
+               to const struct smb_filename * */
+/* Version 37 - Change getwd from char *
+               to const struct smb_filename * */
+/* Version 37 - Change conn->cwd from char *
+               to struct smb_filename * */
+/* Version 37 - Change realpath from char *
+               to struct smb_filename * */
+/* Version 37 - Change connectpath from char *
+               to struct smb_filename * */
 
 #define SMB_VFS_INTERFACE_VERSION 37
 
@@ -417,7 +427,7 @@ typedef struct connection_struct {
        enum timestamp_set_resolution ts_res;
        char *connectpath;
        char *origpath;
-       char *cwd; /* Working directory. */
+       struct smb_filename *cwd_fname; /* Working directory. */
 
        struct vfs_handle_struct *vfs_handles;          /* for the new plugins 
*/
 
@@ -731,8 +741,10 @@ struct vfs_fn_pointers {
                        const struct smb_filename *smb_fname,
                        uid_t uid,
                        gid_t gid);
-       int (*chdir_fn)(struct vfs_handle_struct *handle, const char *path);
-       char *(*getwd_fn)(struct vfs_handle_struct *handle);
+       int (*chdir_fn)(struct vfs_handle_struct *handle,
+                        const struct smb_filename *smb_fname);
+       struct smb_filename *(*getwd_fn)(struct vfs_handle_struct *handle,
+                               TALLOC_CTX *mem_ctx);
        int (*ntimes_fn)(struct vfs_handle_struct *handle,
                         const struct smb_filename *smb_fname,
                         struct smb_file_time *ft);
@@ -761,7 +773,9 @@ struct vfs_fn_pointers {
                                const struct smb_filename *smb_fname,
                                mode_t mode,
                                SMB_DEV_T dev);
-       char *(*realpath_fn)(struct vfs_handle_struct *handle, const char 
*path);
+       struct smb_filename *(*realpath_fn)(struct vfs_handle_struct *handle,
+                               TALLOC_CTX *ctx,
+                               const struct smb_filename *smb_fname);
        int (*chflags_fn)(struct vfs_handle_struct *handle,
                                const struct smb_filename *smb_fname,
                                unsigned int flags);
@@ -818,7 +832,7 @@ struct vfs_fn_pointers {
                                    char **found_name);
 
        const char *(*connectpath_fn)(struct vfs_handle_struct *handle,
-                                     const char *filename);
+                                     const struct smb_filename *smb_fname);
 
        NTSTATUS (*brl_lock_windows_fn)(struct vfs_handle_struct *handle,
                                        struct byte_range_lock *br_lck,
@@ -1232,8 +1246,10 @@ int smb_vfs_call_lchown(struct vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        uid_t uid,
                        gid_t gid);
-int smb_vfs_call_chdir(struct vfs_handle_struct *handle, const char *path);
-char *smb_vfs_call_getwd(struct vfs_handle_struct *handle);
+int smb_vfs_call_chdir(struct vfs_handle_struct *handle,
+                       const struct smb_filename *smb_fname);
+struct smb_filename *smb_vfs_call_getwd(struct vfs_handle_struct *handle,
+                               TALLOC_CTX *ctx);
 int smb_vfs_call_ntimes(struct vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        struct smb_file_time *ft);
@@ -1269,7 +1285,9 @@ int smb_vfs_call_mknod(struct vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        mode_t mode,
                        SMB_DEV_T dev);
-char *smb_vfs_call_realpath(struct vfs_handle_struct *handle, const char 
*path);
+struct smb_filename *smb_vfs_call_realpath(struct vfs_handle_struct *handle,
+                       TALLOC_CTX *ctx,
+                       const struct smb_filename *smb_fname);
 int smb_vfs_call_chflags(struct vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        unsigned int flags);
@@ -1285,7 +1303,7 @@ int smb_vfs_call_get_real_filename(struct 
vfs_handle_struct *handle,
                                   const char *path, const char *name,
                                   TALLOC_CTX *mem_ctx, char **found_name);
 const char *smb_vfs_call_connectpath(struct vfs_handle_struct *handle,
-                                    const char *filename);
+                                    const struct smb_filename *smb_fname);
 NTSTATUS smb_vfs_call_brl_lock_windows(struct vfs_handle_struct *handle,
                                       struct byte_range_lock *br_lck,
                                       struct lock_struct *plock,
diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h
index 77646b4..4365f15 100644
--- a/source3/include/vfs_macros.h
+++ b/source3/include/vfs_macros.h
@@ -266,15 +266,15 @@
 #define SMB_VFS_NEXT_LCHOWN(handle, smb_fname, uid, gid) \
        smb_vfs_call_lchown((handle)->next, (smb_fname), (uid), (gid))
 
-#define SMB_VFS_CHDIR(conn, path) \
-       smb_vfs_call_chdir((conn)->vfs_handles, (path))
-#define SMB_VFS_NEXT_CHDIR(handle, path) \
-       smb_vfs_call_chdir((handle)->next, (path))
+#define SMB_VFS_CHDIR(conn, smb_fname) \
+       smb_vfs_call_chdir((conn)->vfs_handles, (smb_fname))
+#define SMB_VFS_NEXT_CHDIR(handle, smb_fname) \
+       smb_vfs_call_chdir((handle)->next, (smb_fname))
 
-#define SMB_VFS_GETWD(conn) \
-       smb_vfs_call_getwd((conn)->vfs_handles)
-#define SMB_VFS_NEXT_GETWD(handle) \
-       smb_vfs_call_getwd((handle)->next)
+#define SMB_VFS_GETWD(conn, ctx) \
+       smb_vfs_call_getwd((conn)->vfs_handles, (ctx))
+#define SMB_VFS_NEXT_GETWD(handle, ctx) \
+       smb_vfs_call_getwd((handle)->next, (ctx))
 
 #define SMB_VFS_NTIMES(conn, path, ts) \
        smb_vfs_call_ntimes((conn)->vfs_handles, (path), (ts))
@@ -331,10 +331,10 @@
 #define SMB_VFS_NEXT_MKNOD(handle, smb_fname, mode, dev) \
        smb_vfs_call_mknod((handle)->next, (smb_fname), (mode), (dev))
 
-#define SMB_VFS_REALPATH(conn, path) \
-       smb_vfs_call_realpath((conn)->vfs_handles, (path))
-#define SMB_VFS_NEXT_REALPATH(handle, path) \
-       smb_vfs_call_realpath((handle)->next, (path))
+#define SMB_VFS_REALPATH(conn, ctx, smb_fname) \
+       smb_vfs_call_realpath((conn)->vfs_handles, (ctx), (smb_fname))
+#define SMB_VFS_NEXT_REALPATH(handle, ctx, smb_fname) \
+       smb_vfs_call_realpath((handle)->next, (ctx), (smb_fname))
 
 #define SMB_VFS_CHFLAGS(conn, smb_fname, flags) \
        smb_vfs_call_chflags((conn)->vfs_handles, (smb_fname), (flags))
@@ -356,10 +356,10 @@
 #define SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx, 
found_name) \
        smb_vfs_call_get_real_filename((handle)->next, (path), (name), 
(mem_ctx), (found_name))
 
-#define SMB_VFS_CONNECTPATH(conn, fname) \
-       smb_vfs_call_connectpath((conn)->vfs_handles, (fname))
-#define SMB_VFS_NEXT_CONNECTPATH(conn, fname) \
-       smb_vfs_call_connectpath((conn)->next, (fname))
+#define SMB_VFS_CONNECTPATH(conn, smb_fname) \
+       smb_vfs_call_connectpath((conn)->vfs_handles, (smb_fname))
+#define SMB_VFS_NEXT_CONNECTPATH(conn, smb_fname) \
+       smb_vfs_call_connectpath((conn)->next, (smb_fname))
 
 #define SMB_VFS_BRL_LOCK_WINDOWS(conn, br_lck, plock, blocking_lock) \
        smb_vfs_call_brl_lock_windows((conn)->vfs_handles, (br_lck), (plock), 
(blocking_lock))
diff --git a/source3/modules/vfs_acl_common.c b/source3/modules/vfs_acl_common.c
index bd1d755..6abf1e3 100644
--- a/source3/modules/vfs_acl_common.c
+++ b/source3/modules/vfs_acl_common.c
@@ -1288,7 +1288,7 @@ static NTSTATUS fset_nt_acl_common(vfs_handle_struct 
*handle, files_struct *fsp,
 }
 
 static int acl_common_remove_object(vfs_handle_struct *handle,
-                                       const char *path,
+                                       const struct smb_filename *smb_fname,
                                        bool is_directory)
 {
        connection_struct *conn = handle->conn;
@@ -1297,17 +1297,18 @@ static int acl_common_remove_object(vfs_handle_struct 
*handle,
        int ret = 0;
        char *parent_dir = NULL;
        const char *final_component = NULL;
-       struct smb_filename local_fname;
+       struct smb_filename local_fname = {0};
+       struct smb_filename parent_dir_fname = {0};
        int saved_errno = 0;
-       char *saved_dir = NULL;
+       struct smb_filename *saved_dir_fname = NULL;
 
-       saved_dir = vfs_GetWd(talloc_tos(),conn);
-       if (!saved_dir) {
+       saved_dir_fname = vfs_GetWd(talloc_tos(),conn);
+       if (saved_dir_fname == NULL) {
                saved_errno = errno;
                goto out;
        }
 
-       if (!parent_dirname(talloc_tos(), path,
+       if (!parent_dirname(talloc_tos(), smb_fname->base_name,
                        &parent_dir, &final_component)) {
                saved_errno = ENOMEM;
                goto out;
@@ -1316,14 +1317,15 @@ static int acl_common_remove_object(vfs_handle_struct 
*handle,
        DBG_DEBUG("removing %s %s/%s\n", is_directory ? "directory" : "file",
                  parent_dir, final_component);
 
+       parent_dir_fname = (struct smb_filename) { .base_name = parent_dir };
+
        /* cd into the parent dir to pin it. */
-       ret = vfs_ChDir(conn, parent_dir);
+       ret = vfs_ChDir(conn, &parent_dir_fname);
        if (ret == -1) {
                saved_errno = errno;
                goto out;
        }
 
-       ZERO_STRUCT(local_fname);
        local_fname.base_name = discard_const_p(char, final_component);
 
        /* Must use lstat here. */
@@ -1370,8 +1372,9 @@ static int acl_common_remove_object(vfs_handle_struct 
*handle,
 
        TALLOC_FREE(parent_dir);
 
-       if (saved_dir) {
-               vfs_ChDir(conn, saved_dir);
+       if (saved_dir_fname) {
+               vfs_ChDir(conn, saved_dir_fname);
+               TALLOC_FREE(saved_dir_fname);
        }
        if (saved_errno) {
                errno = saved_errno;
@@ -1393,7 +1396,7 @@ static int rmdir_acl_common(struct vfs_handle_struct 
*handle,
                /* Failed due to access denied,
                   see if we need to root override. */
                return acl_common_remove_object(handle,
-                                               smb_fname->base_name,
+                                               smb_fname,
                                                true);
        }
 
@@ -1422,7 +1425,7 @@ static int unlink_acl_common(struct vfs_handle_struct 
*handle,
                        return -1;
                }
                return acl_common_remove_object(handle,
-                                       smb_fname->base_name,
+                                       smb_fname,
                                        false);
        }
 
diff --git a/source3/modules/vfs_cap.c b/source3/modules/vfs_cap.c
index c07a059..e4d30cb 100644
--- a/source3/modules/vfs_cap.c
+++ b/source3/modules/vfs_cap.c
@@ -436,16 +436,40 @@ static int cap_lchown(vfs_handle_struct *handle,
        return ret;
 }
 
-static int cap_chdir(vfs_handle_struct *handle, const char *path)
+static int cap_chdir(vfs_handle_struct *handle,
+                       const struct smb_filename *smb_fname)
 {
-       char *cappath = capencode(talloc_tos(), path);
+       struct smb_filename *cap_smb_fname = NULL;
+       char *cappath = capencode(talloc_tos(), smb_fname->base_name);
+       int ret;
+       int saved_errno = 0;
 
        if (!cappath) {
                errno = ENOMEM;
                return -1;
        }
-       DEBUG(3,("cap: cap_chdir for %s\n", path));
-       return SMB_VFS_NEXT_CHDIR(handle, cappath);
+       DEBUG(3,("cap: cap_chdir for %s\n", smb_fname->base_name));
+
+       cap_smb_fname = synthetic_smb_fname(talloc_tos(),
+                                       cappath,
+                                       NULL,
+                                       NULL,
+                                       smb_fname->flags);
+       if (cap_smb_fname == NULL) {
+               TALLOC_FREE(cappath);
+               errno = ENOMEM;
+               return -1;
+       }
+       ret = SMB_VFS_NEXT_CHDIR(handle, cap_smb_fname);
+       if (ret == -1) {
+               saved_errno = errno;
+       }
+       TALLOC_FREE(cappath);
+       TALLOC_FREE(cap_smb_fname);
+       if (saved_errno != 0) {
+               errno = saved_errno;
+       }
+       return ret;
 }
 
 static int cap_ntimes(vfs_handle_struct *handle,
@@ -643,16 +667,40 @@ static int cap_mknod(vfs_handle_struct *handle,
        return ret;
 }
 
-static char *cap_realpath(vfs_handle_struct *handle, const char *path)
+static struct smb_filename *cap_realpath(vfs_handle_struct *handle,
+                       TALLOC_CTX *ctx,
+                       const struct smb_filename *smb_fname)
 {
         /* monyo need capencode'ed and capdecode'ed? */
-       char *cappath = capencode(talloc_tos(), path);
+       struct smb_filename *cap_smb_fname = NULL;
+       struct smb_filename *return_fname = NULL;
+       char *cappath = capencode(talloc_tos(), smb_fname->base_name);
+       int saved_errno = 0;
 
        if (!cappath) {
                errno = ENOMEM;
                return NULL;
        }
-       return SMB_VFS_NEXT_REALPATH(handle, cappath);
+       cap_smb_fname = synthetic_smb_fname(ctx,
+                                       cappath,
+                                       NULL,
+                                       NULL,
+                                       smb_fname->flags);
+       if (cap_smb_fname == NULL) {
+               TALLOC_FREE(cappath);
+               errno = ENOMEM;
+               return NULL;
+       }
+       return_fname = SMB_VFS_NEXT_REALPATH(handle, ctx, cap_smb_fname);
+       if (return_fname == NULL) {
+               saved_errno = errno;
+       }
+       TALLOC_FREE(cappath);
+       TALLOC_FREE(cap_smb_fname);
+       if (saved_errno != 0) {
+               errno = saved_errno;
+       }
+       return return_fname;
 }
 
 static int cap_chmod_acl(vfs_handle_struct *handle,
diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c
index ed16e43..6adf441 100644
--- a/source3/modules/vfs_catia.c
+++ b/source3/modules/vfs_catia.c
@@ -991,21 +991,35 @@ static int catia_mkdir(vfs_handle_struct *handle,
 }
 
 static int catia_chdir(vfs_handle_struct *handle,
-                      const char *path)
+                       const struct smb_filename *smb_fname)
 {
        char *name = NULL;
+       struct smb_filename *catia_smb_fname = NULL;
        NTSTATUS status;
        int ret;
 
-       status = catia_string_replace_allocate(handle->conn, path,
-                                       &name, vfs_translate_to_unix);
+       status = catia_string_replace_allocate(handle->conn,
+                                       smb_fname->base_name,
+                                       &name,
+                                       vfs_translate_to_unix);
        if (!NT_STATUS_IS_OK(status)) {
                errno = map_errno_from_nt_status(status);
                return -1;
        }
 
-       ret = SMB_VFS_NEXT_CHDIR(handle, name);
+       catia_smb_fname = synthetic_smb_fname(talloc_tos(),
+                                       name,
+                                       NULL,
+                                       NULL,
+                                       smb_fname->flags);
+       if (catia_smb_fname == NULL) {
+               TALLOC_FREE(name);
+               errno = ENOMEM;
+               return -1;
+       }
+       ret = SMB_VFS_NEXT_CHDIR(handle, catia_smb_fname);
        TALLOC_FREE(name);
+       TALLOC_FREE(catia_smb_fname);
 
        return ret;
 }
@@ -1041,24 +1055,38 @@ static int catia_ntimes(vfs_handle_struct *handle,
        return ret;
 }
 
-static char *
-catia_realpath(vfs_handle_struct *handle, const char *path)
+static struct smb_filename *
+catia_realpath(vfs_handle_struct *handle,
+               TALLOC_CTX *ctx,
+               const struct smb_filename *smb_fname)
 {
        char *mapped_name = NULL;
+       struct smb_filename *catia_smb_fname = NULL;
+       struct smb_filename *return_fname = NULL;
        NTSTATUS status;
-       char *ret = NULL;
 
-       status = catia_string_replace_allocate(handle->conn, path,
+       status = catia_string_replace_allocate(handle->conn,


-- 
Samba Shared Repository

Reply via email to