s3: smbd: Change OpenDir() to take a struct smb_filename *, not a char *.
authorJeremy Allison <jra@samba.org>
Fri, 26 Feb 2016 23:55:14 +0000 (15:55 -0800)
committerRalph Boehme <slow@samba.org>
Tue, 1 Mar 2016 14:25:22 +0000 (15:25 +0100)
Enhances plumbing to remove lp_posix_pathnames() later.

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

index cf11ae5e98032c357523993c2a94a61d05190a67..f3d6620f87d3886b0b6cbb6c3f7b487d9b3d45ee 100644 (file)
@@ -800,7 +800,7 @@ bool recursive_rmdir(TALLOC_CTX *ctx,
 
        SMB_ASSERT(!is_ntfs_stream_smb_fname(smb_dname));
 
-       dir_hnd = OpenDir(talloc_tos(), conn, smb_dname->base_name, NULL, 0);
+       dir_hnd = OpenDir(talloc_tos(), conn, smb_dname, NULL, 0);
        if(dir_hnd == NULL)
                return False;
 
@@ -916,7 +916,7 @@ static NTSTATUS rmdir_internals(TALLOC_CTX *ctx, files_struct *fsp)
                char *talloced = NULL;
                long dirpos = 0;
                struct smb_Dir *dir_hnd = OpenDir(talloc_tos(), conn,
-                                                 smb_dname->base_name, NULL,
+                                                 smb_dname, NULL,
                                                  0);
 
                if(dir_hnd == NULL) {
index 527bd7843148cc0d3a41cbe8fcee36272e35ab2c..b71234e8889c9eccde51a59de1b63979f8ff1c35 100644 (file)
@@ -163,16 +163,33 @@ static struct dptr_struct *dptr_get(struct smbd_server_connection *sconn,
        for(dptr = sconn->searches.dirptrs; dptr; dptr = dptr->next) {
                if(dptr->dnum == key) {
                        if (!forclose && !dptr->dir_hnd) {
+                               struct smb_filename *smb_dname = NULL;
+
                                if (sconn->searches.dirhandles_open >= MAX_OPEN_DIRECTORIES)
                                        dptr_idleoldest(sconn);
                                DEBUG(4,("dptr_get: Reopening dptr key %d\n",key));
-                               if (!(dptr->dir_hnd = OpenDir(
-                                             NULL, dptr->conn, dptr->path,
-                                             dptr->wcard, dptr->attr))) {
-                                       DEBUG(4,("dptr_get: Failed to open %s (%s)\n",dptr->path,
+
+                               smb_dname = synthetic_smb_fname(talloc_tos(),
+                                       dptr->path,
+                                       NULL,
+                                       NULL);
+                               if (smb_dname == NULL) {
+                                       return NULL;
+                               }
+
+                               if (!(dptr->dir_hnd = OpenDir(NULL,
+                                                       dptr->conn,
+                                                       smb_dname,
+                                                       dptr->wcard,
+                                                       dptr->attr))) {
+                                       DEBUG(4,("dptr_get: Failed to "
+                                               "open %s (%s)\n",
+                                               dptr->path,
                                                strerror(errno)));
+                                       TALLOC_FREE(smb_dname);
                                        return NULL;
                                }
+                               TALLOC_FREE(smb_dname);
                        }
                        DLIST_PROMOTE(sconn->searches.dirptrs,dptr);
                        return dptr;
@@ -424,7 +441,7 @@ static struct smb_Dir *open_dir_with_privilege(connection_struct *conn,
                goto out;
        }
 
-       dir_hnd = OpenDir(NULL, conn, ".", wcard, attr);
+       dir_hnd = OpenDir(NULL, conn, smb_fname_cwd, wcard, attr);
 
   out:
 
@@ -510,7 +527,7 @@ NTSTATUS dptr_create(connection_struct *conn,
                                                wcard,
                                                attr);
                } else {
-                       dir_hnd = OpenDir(NULL, conn, path, wcard, attr);
+                       dir_hnd = OpenDir(NULL, conn, smb_dname, wcard, attr);
                }
        }
 
@@ -1589,7 +1606,7 @@ static int smb_Dir_destructor(struct smb_Dir *dirp)
 ********************************************************************/
 
 struct smb_Dir *OpenDir(TALLOC_CTX *mem_ctx, connection_struct *conn,
-                       const char *name,
+                       const struct smb_filename *smb_dname,
                        const char *mask,
                        uint32_t attr)
 {
@@ -1603,10 +1620,7 @@ struct smb_Dir *OpenDir(TALLOC_CTX *mem_ctx, connection_struct *conn,
        dirp->conn = conn;
        dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn));
 
-       dirp->dir_smb_fname = synthetic_smb_fname(dirp,
-                                       name,
-                                       NULL,
-                                       NULL);
+       dirp->dir_smb_fname = cp_smb_filename(dirp, smb_dname);
        if (!dirp->dir_smb_fname) {
                errno = ENOMEM;
                goto fail;
index f2c91845ade7fb5d4c129fbbe861a808bcf339b1..86f66860f5b97af029d1a4741eccdb75347b072c 100644 (file)
@@ -1156,6 +1156,7 @@ static int get_real_filename_full_scan(connection_struct *conn,
        char *talloced = NULL;
        char *unmangled_name = NULL;
        long curpos;
+       struct smb_filename *smb_fname = NULL;
 
        /* handle null paths */
        if ((path == NULL) || (*path == 0)) {
@@ -1196,13 +1197,25 @@ static int get_real_filename_full_scan(connection_struct *conn,
                }
        }
 
+       smb_fname = synthetic_smb_fname(talloc_tos(),
+                                       path,
+                                       NULL,
+                                       NULL);
+       if (smb_fname == NULL) {
+               TALLOC_FREE(unmangled_name);
+               return -1;
+       }
+
        /* open the directory */
-       if (!(cur_dir = OpenDir(talloc_tos(), conn, path, NULL, 0))) {
+       if (!(cur_dir = OpenDir(talloc_tos(), conn, smb_fname, NULL, 0))) {
                DEBUG(3,("scan dir didn't open dir [%s]\n",path));
                TALLOC_FREE(unmangled_name);
+               TALLOC_FREE(smb_fname);
                return -1;
        }
 
+       TALLOC_FREE(smb_fname);
+
        /* now scan for matching names */
        curpos = 0;
        while ((dname = ReadDirName(cur_dir, &curpos, NULL, &talloced))) {
index fe099ae9fb561fbd52b7b09e9a42ffb70c6f319a..3f9ddb58263168aafeb2d09a82793718fa9f8cb9 100644 (file)
@@ -221,8 +221,11 @@ bool get_dir_entry(TALLOC_CTX *ctx,
                bool check_descend,
                bool ask_sharemode);
 bool is_visible_file(connection_struct *conn, const char *dir_path, const char *name, SMB_STRUCT_STAT *pst, bool use_veto);
-struct smb_Dir *OpenDir(TALLOC_CTX *mem_ctx, connection_struct *conn,
-                       const char *name, const char *mask, uint32_t attr);
+struct smb_Dir *OpenDir(TALLOC_CTX *mem_ctx,
+                       connection_struct *conn,
+                       const struct smb_filename *smb_fname,
+                       const char *mask,
+                       uint32_t attr);
 const char *ReadDirName(struct smb_Dir *dirp, long *poffset,
                        SMB_STRUCT_STAT *sbuf, char **talloced);
 void RewindDir(struct smb_Dir *dirp, long *poffset);
index 77d5b6eeb5f7231df5ccc9ba2f3f30e65acef7e4..6763218124506e154a5a7ad30a0fb34957d965dc 100644 (file)
@@ -2977,6 +2977,7 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
        char *fname_mask = NULL;
        int count=0;
        NTSTATUS status = NT_STATUS_OK;
+       struct smb_filename *smb_fname_dir = NULL;
        TALLOC_CTX *ctx = talloc_tos();
 
        /* Split up the directory from the filename/mask. */
@@ -3071,7 +3072,16 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
                        goto out;
                }
 
-               dir_hnd = OpenDir(talloc_tos(), conn, fname_dir, fname_mask,
+               smb_fname_dir = synthetic_smb_fname(talloc_tos(),
+                                       fname_dir,
+                                       NULL,
+                                       NULL);
+               if (smb_fname_dir == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto out;
+               }
+
+               dir_hnd = OpenDir(talloc_tos(), conn, smb_fname_dir, fname_mask,
                                  dirtype);
                if (dir_hnd == NULL) {
                        status = map_nt_error_from_unix(errno);
@@ -3161,6 +3171,7 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
        }
 
  out:
+       TALLOC_FREE(smb_fname_dir);
        TALLOC_FREE(fname_dir);
        TALLOC_FREE(fname_mask);
        return status;
@@ -6847,6 +6858,7 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
                        uint32_t access_mask)
 {
        char *fname_src_dir = NULL;
+       struct smb_filename *smb_fname_src_dir = NULL;
        char *fname_src_mask = NULL;
        int count=0;
        NTSTATUS status = NT_STATUS_OK;
@@ -7019,7 +7031,16 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
                goto out;
        }
 
-       dir_hnd = OpenDir(talloc_tos(), conn, fname_src_dir, fname_src_mask,
+       smb_fname_src_dir = synthetic_smb_fname(talloc_tos(),
+                               fname_src_dir,
+                               NULL,
+                               NULL);
+       if (smb_fname_src_dir == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto out;
+       }
+
+       dir_hnd = OpenDir(talloc_tos(), conn, smb_fname_src_dir, fname_src_mask,
                          attrs);
        if (dir_hnd == NULL) {
                status = map_nt_error_from_unix(errno);
@@ -7175,6 +7196,7 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 
  out:
        TALLOC_FREE(talloced);
+       TALLOC_FREE(smb_fname_src_dir);
        TALLOC_FREE(fname_src_dir);
        TALLOC_FREE(fname_src_mask);
        return status;
@@ -7498,6 +7520,7 @@ void reply_copy(struct smb_request *req)
 {
        connection_struct *conn = req->conn;
        struct smb_filename *smb_fname_src = NULL;
+       struct smb_filename *smb_fname_src_dir = NULL;
        struct smb_filename *smb_fname_dst = NULL;
        char *fname_src = NULL;
        char *fname_dst = NULL;
@@ -7723,7 +7746,20 @@ void reply_copy(struct smb_request *req)
                        goto out;
                }
 
-               dir_hnd = OpenDir(ctx, conn, fname_src_dir, fname_src_mask, 0);
+               smb_fname_src_dir = synthetic_smb_fname(talloc_tos(),
+                                       fname_src_dir,
+                                       NULL,
+                                       NULL);
+               if (smb_fname_src_dir == NULL) {
+                       reply_nterror(req, NT_STATUS_NO_MEMORY);
+                       goto out;
+               }
+
+               dir_hnd = OpenDir(ctx,
+                               conn,
+                               smb_fname_src_dir,
+                               fname_src_mask,
+                               0);
                if (dir_hnd == NULL) {
                        status = map_nt_error_from_unix(errno);
                        reply_nterror(req, status);
@@ -7833,6 +7869,7 @@ void reply_copy(struct smb_request *req)
        SSVAL(req->outbuf,smb_vwv0,count);
  out:
        TALLOC_FREE(smb_fname_src);
+       TALLOC_FREE(smb_fname_src_dir);
        TALLOC_FREE(smb_fname_dst);
        TALLOC_FREE(fname_src);
        TALLOC_FREE(fname_dst);