]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: pass struct smb_filename to get_real_filename()
authorRalph Boehme <slow@samba.org>
Thu, 30 Apr 2020 14:22:19 +0000 (16:22 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 5 May 2020 19:18:40 +0000 (19:18 +0000)
Prepares for passing struct smb_filename to SMB_VFS_GET_REAL_FILENAME().

This also makes it necessary to move the NULL or empty path checks to
unix_convert_step_stat().

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/filename.c
source3/smbd/proto.h

index 06a37fd6b0188004049e91f17d8f8626286798bb..976aa9c4cd99fd83b95135950baba5e74440935c 100644 (file)
@@ -654,6 +654,8 @@ static NTSTATUS unix_convert_step_search_fail(struct uc_state *state)
 
 static NTSTATUS unix_convert_step_stat(struct uc_state *state)
 {
+       struct smb_filename dname;
+       char dot[2] = ".";
        char *found_name = NULL;
        int ret;
 
@@ -752,8 +754,19 @@ static NTSTATUS unix_convert_step_stat(struct uc_state *state)
        if (state->name_has_wildcard) {
                return unix_convert_step_search_fail(state);
        }
+
+       dname = (struct smb_filename) {
+               .base_name = state->dirpath,
+               .twrp = state->smb_fname->twrp,
+       };
+
+       /* handle null paths */
+       if ((dname.base_name == NULL) || (dname.base_name[0] == '\0')) {
+               dname.base_name = dot;
+       }
+
        ret = get_real_filename(state->conn,
-                               state->dirpath,
+                               &dname,
                                state->name,
                                talloc_tos(),
                                &found_name);
@@ -1653,7 +1666,7 @@ static int get_real_filename_full_scan(connection_struct *conn,
 ****************************************************************************/
 
 int get_real_filename(connection_struct *conn,
-                     const char *path,
+                     struct smb_filename *path,
                      const char *name,
                      TALLOC_CTX *mem_ctx,
                      char **found_name)
@@ -1661,16 +1674,11 @@ int get_real_filename(connection_struct *conn,
        int ret;
        bool mangled;
 
-       /* handle null paths */
-       if ((path == NULL) || (*path == 0)) {
-               path = ".";
-       }
-
        mangled = mangle_is_mangled(name, conn->params);
 
        if (mangled) {
                return get_real_filename_full_scan(conn,
-                                                  path,
+                                                  path->base_name,
                                                   name,
                                                   mangled,
                                                   mem_ctx,
@@ -1679,7 +1687,7 @@ int get_real_filename(connection_struct *conn,
 
        /* Try the vfs first to take advantage of case-insensitive stat. */
        ret = SMB_VFS_GET_REAL_FILENAME(conn,
-                                       path,
+                                       path->base_name,
                                        name,
                                        mem_ctx,
                                        found_name);
@@ -1694,7 +1702,7 @@ int get_real_filename(connection_struct *conn,
        }
 
        return get_real_filename_full_scan(conn,
-                                          path,
+                                          path->base_name,
                                           name,
                                           mangled,
                                           mem_ctx,
index a611b1512155540784650d5d781ec51fbd41b5e9..b5dfac548618df9bcf08f7a501a72524c9ac4176 100644 (file)
@@ -368,7 +368,7 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
 NTSTATUS check_name(connection_struct *conn,
                        const struct smb_filename *smb_fname);
 int get_real_filename(connection_struct *conn,
-                     const char *path,
+                     struct smb_filename *path,
                      const char *name,
                      TALLOC_CTX *mem_ctx,
                      char **found_name);