s3: Plumb smb_filename through SMB_VFS_STAT and SMB_VFS_LSTAT
[metze/samba/wip.git] / source3 / smbd / reply.c
index 9c78b9bde0b6a3e891b716a421f3906f392041fa..8cc865edebf6d1f1ed421f753281043fd8aadaec 100644 (file)
@@ -987,10 +987,15 @@ void reply_checkpath(struct smb_request *req)
                return;
        }
 
-       status = resolve_dfspath(ctx, conn,
-                       req->flags2 & FLAGS2_DFS_PATHNAMES,
-                       name,
-                       &name);
+       DEBUG(3,("reply_checkpath %s mode=%d\n", name, (int)SVAL(req->vwv+0, 0)));
+
+       status = filename_convert(ctx,
+                               conn,
+                               req->flags2 & FLAGS2_DFS_PATHNAMES,
+                               name,
+                               &smb_fname,
+                               &name);
+
        if (!NT_STATUS_IS_OK(status)) {
                if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
                        reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
@@ -1001,27 +1006,10 @@ void reply_checkpath(struct smb_request *req)
                goto path_err;
        }
 
-       DEBUG(3,("reply_checkpath %s mode=%d\n", name, (int)SVAL(req->vwv+0, 0)));
-
-       status = unix_convert(ctx, conn, name, &smb_fname, 0);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto path_err;
-       }
-
-       status = get_full_smb_filename(ctx, smb_fname, &name);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto path_err;
-       }
-
-       status = check_name(conn, name);
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(3,("reply_checkpath: check_name of %s failed (%s)\n",name,nt_errstr(status)));
-               goto path_err;
-       }
-
        if (!VALID_STAT(smb_fname->st) &&
-           (SMB_VFS_STAT(conn, name, &smb_fname->st) != 0)) {
-               DEBUG(3,("reply_checkpath: stat of %s failed (%s)\n",name,strerror(errno)));
+           (SMB_VFS_STAT(conn, smb_fname) != 0)) {
+               DEBUG(3,("reply_checkpath: stat of %s failed (%s)\n",
+                       smb_fname_str_dbg(smb_fname), strerror(errno)));
                status = map_nt_error_from_unix(errno);
                goto path_err;
        }
@@ -1033,17 +1021,8 @@ void reply_checkpath(struct smb_request *req)
        }
 
        reply_outbuf(req, 0, 0);
- out:
-       TALLOC_FREE(smb_fname);
-       END_PROFILE(SMBcheckpath);
-       return;
 
  path_err:
-
-       TALLOC_FREE(smb_fname);
-
-       END_PROFILE(SMBcheckpath);
-
        /* We special case this - as when a Windows machine
                is parsing a path is steps through the components
                one at a time - if a component fails it expects
@@ -1060,10 +1039,15 @@ void reply_checkpath(struct smb_request *req)
                 */
                reply_botherror(req, NT_STATUS_OBJECT_NAME_NOT_FOUND,
                                ERRDOS, ERRbadpath);
-               return;
+               goto out;
        }
 
        reply_nterror(req, status);
+
+ out:
+       TALLOC_FREE(smb_fname);
+       END_PROFILE(SMBcheckpath);
+       return;
 }
 
 /****************************************************************************
@@ -1091,20 +1075,6 @@ void reply_getatr(struct smb_request *req)
                goto out;
        }
 
-       status = resolve_dfspath(ctx, conn,
-                               req->flags2 & FLAGS2_DFS_PATHNAMES,
-                               fname,
-                               &fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
-                       reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
-                                       ERRSRV, ERRbadpath);
-                       goto out;
-               }
-               reply_nterror(req, status);
-               goto out;
-       }
-
        /* dos smetimes asks for a stat of "" - it returns a "hidden directory"
                under WfWg - weird! */
        if (*fname == '\0') {
@@ -1115,25 +1085,26 @@ void reply_getatr(struct smb_request *req)
                size = 0;
                mtime = 0;
        } else {
-               status = unix_convert(ctx, conn, fname, &smb_fname, 0);
-               if (!NT_STATUS_IS_OK(status)) {
-                       reply_nterror(req, status);
-                       goto out;
-               }
-               status = get_full_smb_filename(ctx, smb_fname, &fname);
-               if (!NT_STATUS_IS_OK(status)) {
-                       reply_nterror(req, status);
-                       goto out;
-               }
-               status = check_name(conn, fname);
+               status = filename_convert(ctx,
+                               conn,
+                               req->flags2 & FLAGS2_DFS_PATHNAMES,
+                               fname,
+                               &smb_fname,
+                               &fname);
                if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(3,("reply_getatr: check_name of %s failed (%s)\n",fname,nt_errstr(status)));
+                       if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
+                               reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
+                                               ERRSRV, ERRbadpath);
+                               goto out;
+                       }
                        reply_nterror(req, status);
                        goto out;
                }
                if (!VALID_STAT(smb_fname->st) &&
-                   (SMB_VFS_STAT(conn, fname, &smb_fname->st) != 0)) {
-                       DEBUG(3,("reply_getatr: stat of %s failed (%s)\n",fname,strerror(errno)));
+                   (SMB_VFS_STAT(conn, smb_fname) != 0)) {
+                       DEBUG(3,("reply_getatr: stat of %s failed (%s)\n",
+                                smb_fname_str_dbg(smb_fname),
+                                strerror(errno)));
                        reply_unixerror(req, ERRDOS,ERRbadfile);
                        goto out;
                }
@@ -1161,10 +1132,12 @@ void reply_getatr(struct smb_request *req)
                      SVAL(req->outbuf, smb_flg2) | FLAGS2_IS_LONG_NAME);
        }
 
-       DEBUG(3,("reply_getatr: name=%s mode=%d size=%u\n", fname, mode, (unsigned int)size ) );
+       DEBUG(3,("reply_getatr: name=%s mode=%d size=%u\n",
+                smb_fname_str_dbg(smb_fname), mode, (unsigned int)size));
 
  out:
        TALLOC_FREE(smb_fname);
+       TALLOC_FREE(fname);
        END_PROFILE(SMBgetatr);
        return;
 }
@@ -1201,9 +1174,11 @@ void reply_setatr(struct smb_request *req)
                goto out;
        }
 
-       status = resolve_dfspath(ctx, conn,
+       status = filename_convert(ctx,
+                               conn,
                                req->flags2 & FLAGS2_DFS_PATHNAMES,
                                fname,
+                               &smb_fname,
                                &fname);
        if (!NT_STATUS_IS_OK(status)) {
                if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
@@ -1215,24 +1190,6 @@ void reply_setatr(struct smb_request *req)
                goto out;
        }
 
-       status = unix_convert(ctx, conn, fname, &smb_fname, 0);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
-       status = get_full_smb_filename(ctx, smb_fname, &fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
-       status = check_name(conn, fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
        if (fname[0] == '.' && fname[1] == '\0') {
                /*
                 * Not sure here is the right place to catch this
@@ -1367,6 +1324,7 @@ static NTSTATUS split_fname_dir_mask(TALLOC_CTX *ctx, const char *fname_in,
 void reply_search(struct smb_request *req)
 {
        connection_struct *conn = req->conn;
+       char *path = NULL;
        const char *mask = NULL;
        char *directory = NULL;
        char *fname = NULL;
@@ -1379,7 +1337,6 @@ void reply_search(struct smb_request *req)
        bool finished = False;
        const char *p;
        int status_len;
-       char *path = NULL;
        char status[21];
        int dptr_num= -1;
        bool check_descend = False;
@@ -1421,23 +1378,6 @@ void reply_search(struct smb_request *req)
                return;
        }
 
-       nt_status = resolve_dfspath_wcard(ctx, conn,
-                                         req->flags2 & FLAGS2_DFS_PATHNAMES,
-                                         path,
-                                         &path,
-                                         &mask_contains_wcard);
-       if (!NT_STATUS_IS_OK(nt_status)) {
-               if (NT_STATUS_EQUAL(nt_status,NT_STATUS_PATH_NOT_COVERED)) {
-                       reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
-                                       ERRSRV, ERRbadpath);
-                       END_PROFILE(SMBsearch);
-                       return;
-               }
-               reply_nterror(req, nt_status);
-               END_PROFILE(SMBsearch);
-               return;
-       }
-
        p++;
        status_len = SVAL(p, 0);
        p += 2;
@@ -1447,6 +1387,23 @@ void reply_search(struct smb_request *req)
        if (status_len == 0) {
                struct smb_filename *smb_fname = NULL;
 
+               nt_status = resolve_dfspath_wcard(ctx, conn,
+                                         req->flags2 & FLAGS2_DFS_PATHNAMES,
+                                         path,
+                                         &path,
+                                         &mask_contains_wcard);
+               if (!NT_STATUS_IS_OK(nt_status)) {
+                       if (NT_STATUS_EQUAL(nt_status,NT_STATUS_PATH_NOT_COVERED)) {
+                               reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
+                                               ERRSRV, ERRbadpath);
+                               END_PROFILE(SMBsearch);
+                               return;
+                       }
+                       reply_nterror(req, nt_status);
+                       END_PROFILE(SMBsearch);
+                       return;
+               }
+
                nt_status = unix_convert(ctx, conn, path, &smb_fname,
                                         UCF_ALLOW_WCARD_LCOMP);
                if (!NT_STATUS_IS_OK(nt_status)) {
@@ -1769,17 +1726,27 @@ void reply_open(struct smb_request *req)
                goto out;
        }
 
+       status = filename_convert(ctx,
+                               conn,
+                               req->flags2 & FLAGS2_DFS_PATHNAMES,
+                               fname,
+                               &smb_fname,
+                               &fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
+                       reply_botherror(req,
+                                       NT_STATUS_PATH_NOT_COVERED,
+                                       ERRSRV, ERRbadpath);
+                       goto out;
+               }
+               reply_nterror(req, status);
+               goto out;
+       }
+
        if (!map_open_params_to_ntcreate(
                    fname, deny_mode, OPENX_FILE_EXISTS_OPEN, &access_mask,
                    &share_mode, &create_disposition, &create_options)) {
                reply_nterror(req, NT_STATUS_DOS(ERRDOS, ERRbadaccess));
-               END_PROFILE(SMBopen);
-               return;
-       }
-
-       status = unix_convert(ctx, conn, fname, &smb_fname, 0);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
                goto out;
        }
 
@@ -1915,6 +1882,23 @@ void reply_open_and_X(struct smb_request *req)
                goto out;
        }
 
+       status = filename_convert(ctx,
+                               conn,
+                               req->flags2 & FLAGS2_DFS_PATHNAMES,
+                               fname,
+                               &smb_fname,
+                               &fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
+                       reply_botherror(req,
+                                       NT_STATUS_PATH_NOT_COVERED,
+                                       ERRSRV, ERRbadpath);
+                       goto out;
+               }
+               reply_nterror(req, status);
+               goto out;
+       }
+
        if (!map_open_params_to_ntcreate(
                    fname, deny_mode, smb_ofun, &access_mask,
                    &share_mode, &create_disposition, &create_options)) {
@@ -1922,12 +1906,6 @@ void reply_open_and_X(struct smb_request *req)
                goto out;
        }
 
-       status = unix_convert(ctx, conn, fname, &smb_fname, 0);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
        status = SMB_VFS_CREATE_FILE(
                conn,                                   /* conn */
                req,                                    /* req */
@@ -2112,6 +2090,23 @@ void reply_mknew(struct smb_request *req)
                goto out;
        }
 
+       status = filename_convert(ctx,
+                               conn,
+                               req->flags2 & FLAGS2_DFS_PATHNAMES,
+                               fname,
+                               &smb_fname,
+                               &fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
+                       reply_botherror(req,
+                                       NT_STATUS_PATH_NOT_COVERED,
+                                       ERRSRV, ERRbadpath);
+                       goto out;
+               }
+               reply_nterror(req, status);
+               goto out;
+       }
+
        if (fattr & aVOLID) {
                DEBUG(0,("Attempt to create file (%s) with volid set - "
                        "please report this\n", fname));
@@ -2125,12 +2120,6 @@ void reply_mknew(struct smb_request *req)
                create_disposition = FILE_OVERWRITE_IF;
        }
 
-       status = unix_convert(ctx, conn, fname, &smb_fname, 0);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
        status = SMB_VFS_CREATE_FILE(
                conn,                                   /* conn */
                req,                                    /* req */
@@ -2234,9 +2223,10 @@ void reply_ctemp(struct smb_request *req)
                goto out;
        }
 
-       status = resolve_dfspath(ctx, conn,
+       status = filename_convert(ctx, conn,
                                req->flags2 & FLAGS2_DFS_PATHNAMES,
                                fname,
+                               &smb_fname,
                                &fname);
        if (!NT_STATUS_IS_OK(status)) {
                if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
@@ -2248,26 +2238,13 @@ void reply_ctemp(struct smb_request *req)
                goto out;
        }
 
-       status = unix_convert(ctx, conn, fname, &smb_fname, 0);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
-       status = check_name(conn, smb_fname->base_name);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
        tmpfd = mkstemp(smb_fname->base_name);
        if (tmpfd == -1) {
                reply_unixerror(req, ERRDOS, ERRnoaccess);
                goto out;
        }
 
-       SET_STAT_INVALID(smb_fname->st);
-       SMB_VFS_STAT(conn, smb_fname->base_name, &smb_fname->st);
+       SMB_VFS_STAT(conn, smb_fname);
 
        /* We should fail if file does not exist. */
        status = SMB_VFS_CREATE_FILE(
@@ -2400,16 +2377,16 @@ static NTSTATUS do_unlink(connection_struct *conn,
                return NT_STATUS_MEDIA_WRITE_PROTECTED;
        }
 
+       if (SMB_VFS_LSTAT(conn, smb_fname) != 0) {
+               return map_nt_error_from_unix(errno);
+       }
+
        status = get_full_smb_filename(smb_fname, smb_fname, &fname);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
-
-       if (SMB_VFS_LSTAT(conn, fname, &smb_fname->st) != 0) {
-               return map_nt_error_from_unix(errno);
-       }
-
        fattr = dos_mode(conn, fname, &smb_fname->st);
+       TALLOC_FREE(fname);
 
        if (dirtype & FILE_ATTRIBUTE_NORMAL) {
                dirtype = aDIR|aARCH|aRONLY;
@@ -5216,9 +5193,10 @@ void reply_mkdir(struct smb_request *req)
                goto out;
        }
 
-       status = resolve_dfspath(ctx, conn,
+       status = filename_convert(ctx, conn,
                                 req->flags2 & FLAGS2_DFS_PATHNAMES,
                                 directory,
+                                &smb_dname,
                                 &directory);
        if (!NT_STATUS_IS_OK(status)) {
                if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
@@ -5230,18 +5208,6 @@ void reply_mkdir(struct smb_request *req)
                goto out;
        }
 
-       status = unix_convert(ctx, conn, directory, &smb_dname, 0);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
-       status = check_name(conn, smb_dname->base_name);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
        status = create_directory(conn, req, smb_dname);
 
        DEBUG(5, ("create_directory returned %s\n", nt_errstr(status)));
@@ -5293,6 +5259,8 @@ static bool recursive_rmdir(TALLOC_CTX *ctx,
 
        while((dname = ReadDirName(dir_hnd, &offset, &st))) {
                char *fullname = NULL;
+               struct smb_filename *smb_fname = NULL;
+               NTSTATUS status;
 
                if (ISDOT(dname) || ISDOTDOT(dname)) {
                        continue;
@@ -5309,29 +5277,37 @@ static bool recursive_rmdir(TALLOC_CTX *ctx,
                                dname);
                if (!fullname) {
                        errno = ENOMEM;
-                       ret = False;
-                       break;
+                       goto err_break;
                }
 
-               if(SMB_VFS_LSTAT(conn,fullname, &st) != 0) {
-                       ret = False;
-                       break;
+               status = create_synthetic_smb_fname(talloc_tos(), fullname,
+                                                   NULL, NULL, &smb_fname);
+               if (!NT_STATUS_IS_OK(status)) {
+                       goto err_break;
+               }
+
+               if(SMB_VFS_LSTAT(conn, smb_fname) != 0) {
+                       goto err_break;
                }
 
-               if(st.st_ex_mode & S_IFDIR) {
+               if(smb_fname->st.st_ex_mode & S_IFDIR) {
                        if(!recursive_rmdir(ctx, conn, fullname)) {
-                               ret = False;
-                               break;
+                               goto err_break;
                        }
                        if(SMB_VFS_RMDIR(conn,fullname) != 0) {
-                               ret = False;
-                               break;
+                               goto err_break;
                        }
                } else if(SMB_VFS_UNLINK(conn,fullname) != 0) {
-                       ret = False;
-                       break;
+                       goto err_break;
                }
+               TALLOC_FREE(smb_fname);
                TALLOC_FREE(fullname);
+               continue;
+        err_break:
+               TALLOC_FREE(smb_fname);
+               TALLOC_FREE(fullname);
+               ret = false;
+               break;
        }
        TALLOC_FREE(dir_hnd);
        return ret;
@@ -5349,13 +5325,13 @@ NTSTATUS rmdir_internals(TALLOC_CTX *ctx,
        SMB_STRUCT_STAT st;
 
        /* Might be a symlink. */
-       if(SMB_VFS_LSTAT(conn, directory, &st) != 0) {
+       if(vfs_lstat_smb_fname(conn, directory, &st) != 0) {
                return map_nt_error_from_unix(errno);
        }
 
        if (S_ISLNK(st.st_ex_mode)) {
                /* Is what it points to a directory ? */
-               if(SMB_VFS_STAT(conn, directory, &st) != 0) {
+               if(vfs_stat_smb_fname(conn, directory, &st) != 0) {
                        return map_nt_error_from_unix(errno);
                }
                if (!(S_ISDIR(st.st_ex_mode))) {
@@ -5432,7 +5408,7 @@ NTSTATUS rmdir_internals(TALLOC_CTX *ctx,
                                break;
                        }
 
-                       if(SMB_VFS_LSTAT(conn,fullname, &st) != 0) {
+                       if(vfs_lstat_smb_fname(conn,fullname, &st) != 0) {
                                break;
                        }
                        if(st.st_ex_mode & S_IFDIR) {
@@ -5488,9 +5464,10 @@ void reply_rmdir(struct smb_request *req)
                goto out;
        }
 
-       status = resolve_dfspath(ctx, conn,
+       status = filename_convert(ctx, conn,
                                 req->flags2 & FLAGS2_DFS_PATHNAMES,
                                 directory,
+                                &smb_dname,
                                 &directory);
        if (!NT_STATUS_IS_OK(status)) {
                if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
@@ -5502,24 +5479,6 @@ void reply_rmdir(struct smb_request *req)
                goto out;
        }
 
-       status = unix_convert(ctx, conn, directory, &smb_dname, 0);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
-       status = get_full_smb_filename(ctx, smb_dname, &directory);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
-       status = check_name(conn, directory);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
        dptr_closepath(directory, req->smbpid);
        status = rmdir_internals(ctx, conn, directory);
        if (!NT_STATUS_IS_OK(status)) {
@@ -5868,10 +5827,7 @@ NTSTATUS rename_internals_fsp(connection_struct *conn,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       /*
-        * Have vfs_object_exist also fill sbuf1
-        */
-       dst_exists = vfs_object_exist(conn, newname, &sbuf1);
+       dst_exists = vfs_stat_smb_fname(conn, newname, &sbuf1) == 0;
 
        if(!replace_if_exists && dst_exists) {
                DEBUG(3,("rename_internals_fsp: dest exists doing rename %s -> %s\n",
@@ -5897,9 +5853,10 @@ NTSTATUS rename_internals_fsp(connection_struct *conn,
        } else {
                int ret = -1;
                if (fsp->posix_open) {
-                       ret = SMB_VFS_LSTAT(conn,fsp->fsp_name,&sbuf);
+                       ret = vfs_lstat_smb_fname(conn,fsp->fsp_name,&sbuf);
                } else {
-                       ret = SMB_VFS_STAT(conn,fsp->fsp_name,&sbuf);
+
+                       ret = vfs_stat_smb_fname(conn,fsp->fsp_name,&sbuf);
                }
                if (ret == -1) {
                        return map_nt_error_from_unix(errno);
@@ -6056,7 +6013,6 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 
        if (!src_has_wild) {
                files_struct *fsp;
-               char *fname_src = NULL;
                char *fname_dst = NULL;
 
                /*
@@ -6114,24 +6070,17 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
                        smb_fname_dst->base_name = fname_dst_mod;
                }
 
-               status = get_full_smb_filename(ctx, smb_fname_src, &fname_src);
-               if (!NT_STATUS_IS_OK(status)) {
-                       goto out;
-               }
-
                ZERO_STRUCT(smb_fname_src->st);
                if (posix_pathnames) {
-                       SMB_VFS_LSTAT(conn, fname_src, &smb_fname_src->st);
+                       SMB_VFS_LSTAT(conn, smb_fname_src);
                } else {
-                       SMB_VFS_STAT(conn, fname_src, &smb_fname_src->st);
+                       SMB_VFS_STAT(conn, smb_fname_src);
                }
 
                if (S_ISDIR(smb_fname_src->st.st_ex_mode)) {
                        create_options |= FILE_DIRECTORY_FILE;
                }
 
-               TALLOC_FREE(fname_src);
-
                status = SMB_VFS_CREATE_FILE(
                        conn,                           /* conn */
                        req,                            /* req */
@@ -6159,7 +6108,6 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 
                status = get_full_smb_filename(ctx, smb_fname_dst, &fname_dst);
                if (!NT_STATUS_IS_OK(status)) {
-                       TALLOC_FREE(fname_src);
                        goto out;
                }
 
@@ -6210,7 +6158,6 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 
        while ((dname = ReadDirName(dir_hnd, &offset, &smb_fname_src->st))) {
                files_struct *fsp = NULL;
-               char *fname_src = NULL;
                char *fname_dst = NULL;
                char *destname = NULL;
                bool sysdir_entry = False;
@@ -6263,20 +6210,13 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
                TALLOC_FREE(smb_fname_dst->base_name);
                smb_fname_dst->base_name = destname;
 
-               status = get_full_smb_filename(ctx, smb_fname_src, &fname_src);
-               if (!NT_STATUS_IS_OK(status)) {
-                       goto out;
-               }
-
                ZERO_STRUCT(smb_fname_src->st);
                if (posix_pathnames) {
-                       SMB_VFS_LSTAT(conn, fname_src, &smb_fname_src->st);
+                       SMB_VFS_LSTAT(conn, smb_fname_src);
                } else {
-                       SMB_VFS_STAT(conn, fname_src, &smb_fname_src->st);
+                       SMB_VFS_STAT(conn, smb_fname_src);
                }
 
-               TALLOC_FREE(fname_src);
-
                create_options = 0;
 
                if (S_ISDIR(smb_fname_src->st.st_ex_mode)) {
@@ -6467,7 +6407,6 @@ NTSTATUS copy_file(TALLOC_CTX *ctx,
 {
        struct smb_filename *smb_fname_dst_tmp = NULL;
        char *fname_src = NULL;
-       char *fname_dst = NULL;
        SMB_OFF_T ret=-1;
        files_struct *fsp1,*fsp2;
        uint32 dosattrs;
@@ -6553,17 +6492,10 @@ NTSTATUS copy_file(TALLOC_CTX *ctx,
 
        TALLOC_FREE(fname_src);
 
-       status = get_full_smb_filename(talloc_tos(), smb_fname_dst_tmp, &fname_dst);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
-
-       if (SMB_VFS_STAT(conn, fname_dst, &smb_fname_dst_tmp->st) == -1) {
+       if (SMB_VFS_STAT(conn, smb_fname_dst_tmp) == -1) {
                ZERO_STRUCTP(&smb_fname_dst_tmp->st);
        }
 
-       TALLOC_FREE(fname_dst);
-
        /* Open the dst file for writing. */
        status = SMB_VFS_CREATE_FILE(
                conn,                                   /* conn */
@@ -7560,9 +7492,9 @@ void reply_setattrE(struct smb_request *req)
                int ret = -1;
 
                if (fsp->posix_open) {
-                       ret = SMB_VFS_LSTAT(conn, fsp->fsp_name, &sbuf);
+                       ret = vfs_lstat_smb_fname(conn, fsp->fsp_name, &sbuf);
                } else {
-                       ret = SMB_VFS_STAT(conn, fsp->fsp_name, &sbuf);
+                       ret = vfs_stat_smb_fname(conn, fsp->fsp_name, &sbuf);
                }
                if (ret == -1) {
                        status = map_nt_error_from_unix(errno);