The branch, master has been updated
       via  605649edc3d3ce4f760b08fd8ee5684007369be8 (commit)
       via  23c703a01eddfa9103352e0ad43bc9fe39ea0c27 (commit)
       via  00e267008defe18475115a4300addf3cbcabff5a (commit)
       via  4860fc4951a7dbd80d8938f4dba49c42a12b4d00 (commit)
       via  78ce9dd471568773760292ea18478af51c11d71a (commit)
       via  6b49f28592af5c998642bd5d5f76b77c79a22cd7 (commit)
      from  424e7636957f07c044ee24a9bbf650b02291939b (commit)

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


- Log -----------------------------------------------------------------
commit 605649edc3d3ce4f760b08fd8ee5684007369be8
Author: Tim Prouty <tpro...@samba.org>
Date:   Tue Jul 21 11:37:51 2009 -0700

    s3: plumb smb_filename through some of the trans2 posix_* functions

commit 23c703a01eddfa9103352e0ad43bc9fe39ea0c27
Author: Tim Prouty <tpro...@samba.org>
Date:   Tue Jul 21 11:35:17 2009 -0700

    s3: Remove unnecessary callers of get_full_smb_filename
    
    This often times means explicitly denying certain operations on a stream
    as they are not supported or don't make sense at a particular level.  At
    some point in the future these can be enabled, but for now it's better to
    remove ambiguity

commit 00e267008defe18475115a4300addf3cbcabff5a
Author: Tim Prouty <tpro...@samba.org>
Date:   Tue Jul 21 10:28:28 2009 -0700

    s3: Remove the now unused fname parameter from filename_convert()

commit 4860fc4951a7dbd80d8938f4dba49c42a12b4d00
Author: Tim Prouty <tpro...@samba.org>
Date:   Tue Jul 21 10:19:00 2009 -0700

    s3: Fix RENAME_FLAG_RENAME path to stop calling unix_convert twice

commit 78ce9dd471568773760292ea18478af51c11d71a
Author: Tim Prouty <tpro...@samba.org>
Date:   Tue Jul 21 10:18:10 2009 -0700

    s3: Remove unnecessary fname argument from callers of filename_convert

commit 6b49f28592af5c998642bd5d5f76b77c79a22cd7
Author: Tim Prouty <tpro...@samba.org>
Date:   Tue Jul 21 09:29:59 2009 -0700

    s3: Plumb smb_filename through map_open_params_to_ntcreate

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

Summary of changes:
 source3/include/proto.h            |    6 +-
 source3/modules/vfs_default.c      |   58 +++-------
 source3/rpc_server/srv_srvsvc_nt.c |    6 +-
 source3/smbd/close.c               |    5 +-
 source3/smbd/file_access.c         |   10 +--
 source3/smbd/filename.c            |   16 +--
 source3/smbd/nttrans.c             |  129 ++++++++++++---------
 source3/smbd/open.c                |   10 +-
 source3/smbd/reply.c               |  132 ++++++++--------------
 source3/smbd/smb2_create.c         |    3 +-
 source3/smbd/trans2.c              |  223 +++++++++++++++---------------------
 11 files changed, 250 insertions(+), 348 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index c48cebc..77283d9 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -6320,8 +6320,7 @@ NTSTATUS filename_convert(TALLOC_CTX *mem_ctx,
                        connection_struct *conn,
                        bool dfs_path,
                        const char *name_in,
-                       struct smb_filename **pp_smb_fname,
-                       char **pp_name);
+                       struct smb_filename **pp_smb_fname);
 
 /* The following definitions come from smbd/filename_utils.c */
 
@@ -6589,7 +6588,8 @@ NTSTATUS fcb_or_dos_open(struct smb_request *req,
                         uint32 access_mask,
                         uint32 share_access,
                         uint32 create_options);
-bool map_open_params_to_ntcreate(const char *fname, int deny_mode, int 
open_func,
+bool map_open_params_to_ntcreate(const struct smb_filename *smb_fname,
+                                int deny_mode, int open_func,
                                 uint32 *paccess_mask,
                                 uint32 *pshare_mode,
                                 uint32 *pcreate_disposition,
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index d6a66b0..cdfd28c 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -218,27 +218,17 @@ static int vfswrap_open(vfs_handle_struct *handle,
                        struct smb_filename *smb_fname,
                        files_struct *fsp, int flags, mode_t mode)
 {
-       int result;
-       NTSTATUS status;
-       char *fname = NULL;
+       int result = -1;
 
        START_PROFILE(syscall_open);
 
-       /*
-        * XXX: Should an error be returned if there is a stream rather than
-        * trying to open a filename with a ':'?
-        */
-       status = get_full_smb_filename(talloc_tos(), smb_fname,
-                                      &fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               errno = map_errno_from_nt_status(status);
-               return -1;
+       if (smb_fname->stream_name) {
+               errno = ENOENT;
+               goto out;
        }
 
-       result = sys_open(fname, flags, mode);
-
-       TALLOC_FREE(fname);
-
+       result = sys_open(smb_fname->base_name, flags, mode);
+ out:
        END_PROFILE(syscall_open);
        return result;
 }
@@ -562,23 +552,17 @@ static int vfswrap_fsync(vfs_handle_struct *handle, 
files_struct *fsp)
 static int vfswrap_stat(vfs_handle_struct *handle,
                        struct smb_filename *smb_fname)
 {
-       int result;
-       NTSTATUS status;
-       char *fname = NULL;
+       int result = -1;
 
        START_PROFILE(syscall_stat);
 
-       status = get_full_smb_filename(talloc_tos(), smb_fname,
-                                      &fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               errno = map_errno_from_nt_status(status);
-               return -1;
+       if (smb_fname->stream_name) {
+               errno = ENOENT;
+               goto out;
        }
 
-       result = sys_stat(fname, &smb_fname->st);
-
-       TALLOC_FREE(fname);
-
+       result = sys_stat(smb_fname->base_name, &smb_fname->st);
+ out:
        END_PROFILE(syscall_stat);
        return result;
 }
@@ -596,23 +580,17 @@ static int vfswrap_fstat(vfs_handle_struct *handle, 
files_struct *fsp, SMB_STRUC
 static int vfswrap_lstat(vfs_handle_struct *handle,
                         struct smb_filename *smb_fname)
 {
-       int result;
-       NTSTATUS status;
-       char *fname = NULL;
+       int result = -1;
 
        START_PROFILE(syscall_lstat);
 
-       status = get_full_smb_filename(talloc_tos(), smb_fname,
-                                      &fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               errno = map_errno_from_nt_status(status);
-               return -1;
+       if (smb_fname->stream_name) {
+               errno = ENOENT;
+               goto out;
        }
 
-       result = sys_lstat(fname, &smb_fname->st);
-
-       TALLOC_FREE(fname);
-
+       result = sys_lstat(smb_fname->base_name, &smb_fname->st);
+ out:
        END_PROFILE(syscall_lstat);
        return result;
 }
diff --git a/source3/rpc_server/srv_srvsvc_nt.c 
b/source3/rpc_server/srv_srvsvc_nt.c
index c58c08e..b9d1ed6 100644
--- a/source3/rpc_server/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srv_srvsvc_nt.c
@@ -2072,8 +2072,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p,
                                        conn,
                                        false,
                                        r->in.file,
-                                       &smb_fname,
-                                       NULL);
+                                       &smb_fname);
        if (!NT_STATUS_IS_OK(nt_status)) {
                werr = ntstatus_to_werror(nt_status);
                goto error_exit;
@@ -2201,8 +2200,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p,
                                        conn,
                                        false,
                                        r->in.file,
-                                       &smb_fname,
-                                       NULL);
+                                       &smb_fname);
        if (!NT_STATUS_IS_OK(nt_status)) {
                werr = ntstatus_to_werror(nt_status);
                goto error_exit;
diff --git a/source3/smbd/close.c b/source3/smbd/close.c
index f878aaa..788b0a7 100644
--- a/source3/smbd/close.c
+++ b/source3/smbd/close.c
@@ -47,10 +47,7 @@ static NTSTATUS check_magic(struct files_struct *fsp)
 
        ctx = talloc_stackframe();
 
-       status = get_full_smb_filename(ctx, fsp->fsp_name, &fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
+       fname = fsp->fsp_name->base_name;
 
        if (!(p = strrchr_m(fname,'/'))) {
                p = fname;
diff --git a/source3/smbd/file_access.c b/source3/smbd/file_access.c
index d8fee1d..7d0a552 100644
--- a/source3/smbd/file_access.c
+++ b/source3/smbd/file_access.c
@@ -33,7 +33,6 @@ bool can_access_file_acl(struct connection_struct *conn,
        NTSTATUS status;
        uint32_t access_granted;
        struct security_descriptor *secdesc = NULL;
-       char *fname = NULL;
        bool ret;
 
        if (conn->server_info->utok.uid == 0 || conn->admin_user) {
@@ -41,13 +40,7 @@ bool can_access_file_acl(struct connection_struct *conn,
                return true;
        }
 
-       status = get_full_smb_filename(talloc_tos(), smb_fname, &fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               ret = false;
-               goto out;
-       }
-
-       status = SMB_VFS_GET_NT_ACL(conn, fname,
+       status = SMB_VFS_GET_NT_ACL(conn, smb_fname->base_name,
                                    (OWNER_SECURITY_INFORMATION |
                                     GROUP_SECURITY_INFORMATION |
                                     DACL_SECURITY_INFORMATION),
@@ -62,7 +55,6 @@ bool can_access_file_acl(struct connection_struct *conn,
                                 access_mask, &access_granted);
        ret = NT_STATUS_IS_OK(status);
  out:
-       TALLOC_FREE(fname);
        TALLOC_FREE(secdesc);
        return ret;
 }
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index c05f0e6..541b0cd 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -1018,8 +1018,7 @@ NTSTATUS filename_convert(TALLOC_CTX *ctx,
                                connection_struct *conn,
                                bool dfs_path,
                                const char *name_in,
-                               struct smb_filename **pp_smb_fname,
-                               char **pp_name)
+                               struct smb_filename **pp_smb_fname)
 {
        NTSTATUS status;
        char *fname = NULL;
@@ -1046,22 +1045,15 @@ NTSTATUS filename_convert(TALLOC_CTX *ctx,
                return status;
        }
 
-       status = get_full_smb_filename(ctx, *pp_smb_fname, &fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
-
-       status = check_name(conn, fname);
+       status = check_name(conn, (*pp_smb_fname)->base_name);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(3,("filename_convert: check_name failed "
                        "for name %s with %s\n",
-                       fname,
+                       smb_fname_str_dbg(*pp_smb_fname),
                        nt_errstr(status) ));
+               TALLOC_FREE(*pp_smb_fname);
                return status;
        }
 
-       if (pp_name != NULL) {
-               *pp_name = fname;
-       }
        return status;
 }
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index ecb8829..43212dc 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -478,8 +478,7 @@ void reply_ntcreate_and_X(struct smb_request *req)
                                conn,
                                req->flags2 & FLAGS2_DFS_PATHNAMES,
                                fname,
-                               &smb_fname,
-                               NULL);
+                               &smb_fname);
 
        if (!NT_STATUS_IS_OK(status)) {
                if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
@@ -968,8 +967,7 @@ static void call_nt_transact_create(connection_struct *conn,
                                conn,
                                req->flags2 & FLAGS2_DFS_PATHNAMES,
                                fname,
-                               &smb_fname,
-                               NULL);
+                               &smb_fname);
 
        if (!NT_STATUS_IS_OK(status)) {
                if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
@@ -1317,8 +1315,7 @@ void reply_ntrename(struct smb_request *req)
 
        if (req->wct < 4) {
                reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
-               END_PROFILE(SMBntrename);
-               return;
+               goto out;
        }
 
        attrs = SVAL(req->vwv+0, 0);
@@ -1329,14 +1326,12 @@ void reply_ntrename(struct smb_request *req)
                                       &status, &src_has_wcard);
        if (!NT_STATUS_IS_OK(status)) {
                reply_nterror(req, status);
-               END_PROFILE(SMBntrename);
-               return;
+               goto out;
        }
 
        if (ms_has_wild(oldname)) {
                reply_nterror(req, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);
-               END_PROFILE(SMBntrename);
-               return;
+               goto out;
        }
 
        p++;
@@ -1344,55 +1339,83 @@ void reply_ntrename(struct smb_request *req)
                                       &status, &dest_has_wcard);
        if (!NT_STATUS_IS_OK(status)) {
                reply_nterror(req, status);
-               END_PROFILE(SMBntrename);
-               return;
+               goto out;
        }
 
-       status = filename_convert(ctx, conn,
-                               req->flags2 & FLAGS2_DFS_PATHNAMES,
-                               oldname,
-                               &smb_fname_old,
-                               &oldname);
-       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);
-                       END_PROFILE(SMBntrename);
-                       return;
-               }
-               reply_nterror(req, status);
-               END_PROFILE(SMBntrename);
-               return;
+       /* The newname must begin with a ':' if the oldname contains a ':'. */
+       if (strchr_m(oldname, ':') && (newname[0] != ':')) {
+               reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
+               goto out;
        }
 
-       status = filename_convert(ctx, conn,
-                               req->flags2 & FLAGS2_DFS_PATHNAMES,
-                               newname,
-                               &smb_fname_new,
-                               &newname);
-       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);
-                       END_PROFILE(SMBntrename);
-                       return;
+       /* rename_internals() calls unix_convert(), so don't call it here. */
+       if (rename_type != RENAME_FLAG_RENAME) {
+               status = filename_convert(ctx, conn,
+                                         req->flags2 & FLAGS2_DFS_PATHNAMES,
+                                         oldname,
+                                         &smb_fname_old);
+               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;
                }
-               reply_nterror(req, status);
-               END_PROFILE(SMBntrename);
-               return;
-       }
 
-       /* The new name must begin with a ':' if the old name is a stream. */
-       if (is_ntfs_stream_smb_fname(smb_fname_old) && (newname[0] != ':')) {
-               reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
-               END_PROFILE(SMBntrename);
-               return;
-       }
+               status = filename_convert(ctx, conn,
+                                         req->flags2 & FLAGS2_DFS_PATHNAMES,
+                                         newname,
+                                         &smb_fname_new);
+               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;
+               }
 
-       DEBUG(3,("reply_ntrename : %s -> %s\n",oldname,newname));
+               DEBUG(3,("reply_ntrename: %s -> %s\n",
+                        smb_fname_str_dbg(smb_fname_old),
+                        smb_fname_str_dbg(smb_fname_new)));
+       }
 
        switch(rename_type) {
                case RENAME_FLAG_RENAME:
+                       status = resolve_dfspath(ctx, conn,
+                                                (req->flags2 &
+                                                    FLAGS2_DFS_PATHNAMES),
+                                                oldname, &oldname);
+                       if (!NT_STATUS_IS_OK(status)) {
+                               DEBUG(10,("resolve_dfspath failed for name %s "
+                                         "with %s\n", oldname,
+                                         nt_errstr(status)));
+                               reply_nterror(req, status);
+                               goto out;
+                       }
+
+                       status = resolve_dfspath(ctx, conn,
+                                                (req->flags2 &
+                                                    FLAGS2_DFS_PATHNAMES),
+                                                newname, &newname);
+                       if (!NT_STATUS_IS_OK(status)) {
+                               DEBUG(10,("resolve_dfspath failed for name %s "
+                                         "with %s\n", newname,
+                                         nt_errstr(status)));
+                               reply_nterror(req, status);
+                               goto out;
+                       }
+
+                       DEBUG(3,("reply_ntrename: %s -> %s\n", oldname,
+                               newname));
+
                        status = rename_internals(ctx, conn, req, oldname,
                                        newname, attrs, False, src_has_wcard,
                                        dest_has_wcard, DELETE_ACCESS);
@@ -1430,17 +1453,15 @@ void reply_ntrename(struct smb_request *req)
        if (!NT_STATUS_IS_OK(status)) {
                if (open_was_deferred(req->mid)) {
                        /* We have re-scheduled this call. */
-                       END_PROFILE(SMBntrename);
-                       return;
+                       goto out;
                }
 
                reply_nterror(req, status);
-               END_PROFILE(SMBntrename);
-               return;
+               goto out;
        }
 
        reply_outbuf(req, 0, 0);
-
+ out:
        END_PROFILE(SMBntrename);
        return;
 }
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 7692c7c..87cab19 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -1199,7 +1199,8 @@ NTSTATUS fcb_or_dos_open(struct smb_request *req,
  Open a file with a share mode - old openX method - map into NTCreate.
 ****************************************************************************/
 
-bool map_open_params_to_ntcreate(const char *fname, int deny_mode, int 
open_func,
+bool map_open_params_to_ntcreate(const struct smb_filename *smb_fname,
+                                int deny_mode, int open_func,
                                 uint32 *paccess_mask,
                                 uint32 *pshare_mode,
                                 uint32 *pcreate_disposition,
@@ -1212,7 +1213,8 @@ bool map_open_params_to_ntcreate(const char *fname, int 
deny_mode, int open_func
 
        DEBUG(10,("map_open_params_to_ntcreate: fname = %s, deny_mode = 0x%x, "
                  "open_func = 0x%x\n",
-                 fname, (unsigned int)deny_mode, (unsigned int)open_func ));
+                 smb_fname_str_dbg(smb_fname), (unsigned int)deny_mode,
+                 (unsigned int)open_func ));
 
        /* Create the NT compatible access_mask. */
        switch (GET_OPENX_MODE(deny_mode)) {
@@ -1286,7 +1288,7 @@ bool map_open_params_to_ntcreate(const char *fname, int 
deny_mode, int open_func
 
                case DENY_DOS:
                        create_options |= NTCREATEX_OPTIONS_PRIVATE_DENY_DOS;
-                       if (is_executable(fname)) {
+                       if (is_executable(smb_fname->base_name)) {
                                share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE;
                        } else {
                                if (GET_OPENX_MODE(deny_mode) == 
DOS_OPEN_RDONLY) {
@@ -1311,7 +1313,7 @@ bool map_open_params_to_ntcreate(const char *fname, int 
deny_mode, int open_func
        DEBUG(10,("map_open_params_to_ntcreate: file %s, access_mask = 0x%x, "
                  "share_mode = 0x%x, create_disposition = 0x%x, "
                  "create_options = 0x%x\n",
-                 fname,
+                 smb_fname_str_dbg(smb_fname),
                  (unsigned int)access_mask,
                  (unsigned int)share_mode,
                  (unsigned int)create_disposition,
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 46fdd4a..76d32a2 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -994,8 +994,7 @@ void reply_checkpath(struct smb_request *req)
                                conn,
                                req->flags2 & FLAGS2_DFS_PATHNAMES,
                                name,
-                               &smb_fname,
-                               NULL);
+                               &smb_fname);
 
        if (!NT_STATUS_IS_OK(status)) {
                if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
@@ -1091,8 +1090,7 @@ void reply_getatr(struct smb_request *req)
                                conn,
                                req->flags2 & FLAGS2_DFS_PATHNAMES,
                                fname,
-                               &smb_fname,
-                               NULL);
+                               &smb_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,
@@ -1193,8 +1191,7 @@ void reply_setatr(struct smb_request *req)
                                conn,


-- 
Samba Shared Repository

Reply via email to