r23724: Reduce access to the global inbuf a tiny bit. Add a struct smb_request
authorVolker Lendecke <vlendec@samba.org>
Thu, 5 Jul 2007 16:26:27 +0000 (16:26 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:23:48 +0000 (12:23 -0500)
that contains some of the fields from the SMB header, removing the need
to access inbuf directly. This right now is used only in the open file
code & friends, and creating that header is only done when needed. This
needs more work, but it is a start.

Jeremy, I'm only checking this into 3_0, please review before I merge it
to _26.

Volker
(This used to be commit ca988f4e79e977160d82e86486972afd15d4acf5)

source3/include/smb.h
source3/printing/nt_printing.c
source3/rpc_server/srv_srvsvc_nt.c
source3/smbd/dir.c
source3/smbd/nttrans.c
source3/smbd/open.c
source3/smbd/posix_acls.c
source3/smbd/process.c
source3/smbd/reply.c
source3/smbd/trans2.c

index 9c7b32f58aed38a1716708389cb7b753e581d8a3..95889f86e5d59212b4ccf6640e63d1683d9fbb84 100644 (file)
@@ -682,6 +682,13 @@ struct current_user {
        NT_USER_TOKEN *nt_user_token;
 };
 
+struct smb_request {
+       uint16 flags2;
+       uint16 smbpid;
+       uint16 mid;
+       uint16 vuid;
+};
+
 /* Defines for the sent_oplock_break field above. */
 #define NO_BREAK_SENT 0
 #define BREAK_TO_NONE_SENT 1
index 84dba9d55a767be31f4f43ead052c9ef2d31e132..c0a9407d6af6f603c0da4293ec0889b7e0b4c4eb 100644 (file)
@@ -1291,7 +1291,7 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
 
        driver_unix_convert(filepath,conn,NULL,&stat_buf);
 
-       status = open_file_ntcreate(conn, filepath, &stat_buf,
+       status = open_file_ntcreate(conn, NULL, filepath, &stat_buf,
                                FILE_GENERIC_READ,
                                FILE_SHARE_READ|FILE_SHARE_WRITE,
                                FILE_OPEN,
@@ -1327,7 +1327,7 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
        pstrcpy(filepath, new_file);
        driver_unix_convert(filepath,conn,NULL,&stat_buf);
 
-       status = open_file_ntcreate(conn, filepath, &stat_buf,
+       status = open_file_ntcreate(conn, NULL, filepath, &stat_buf,
                                FILE_GENERIC_READ,
                                FILE_SHARE_READ|FILE_SHARE_WRITE,
                                FILE_OPEN,
@@ -1460,7 +1460,7 @@ static uint32 get_correct_cversion(const char *architecture, fstring driverpath_
                goto error_exit;
        }
 
-       status = open_file_ntcreate(conn, driverpath, &st,
+       status = open_file_ntcreate(conn, NULL, driverpath, &st,
                                FILE_GENERIC_READ,
                                FILE_SHARE_READ|FILE_SHARE_WRITE,
                                FILE_OPEN,
@@ -4941,7 +4941,7 @@ static BOOL delete_driver_files( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info_3, struct
                        pstrcpy( file, s );
                        driver_unix_convert(file, conn, NULL, &st);
                        DEBUG(10,("deleting driverfile [%s]\n", s));
-                       unlink_internals(conn, 0, file, False, False);
+                       unlink_internals(conn, NULL, 0, file, False);
                }
        }
                
@@ -4950,7 +4950,7 @@ static BOOL delete_driver_files( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info_3, struct
                        pstrcpy( file, s );
                        driver_unix_convert(file, conn, NULL, &st);
                        DEBUG(10,("deleting configfile [%s]\n", s));
-                       unlink_internals(conn, 0, file, False, False);
+                       unlink_internals(conn, NULL, 0, file, False);
                }
        }
        
@@ -4959,7 +4959,7 @@ static BOOL delete_driver_files( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info_3, struct
                        pstrcpy( file, s );
                        driver_unix_convert(file, conn, NULL, &st);
                        DEBUG(10,("deleting datafile [%s]\n", s));
-                       unlink_internals(conn, 0, file, False, False);
+                       unlink_internals(conn, NULL, 0, file, False);
                }
        }
        
@@ -4968,7 +4968,7 @@ static BOOL delete_driver_files( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info_3, struct
                        pstrcpy( file, s );
                        driver_unix_convert(file, conn, NULL, &st);
                        DEBUG(10,("deleting helpfile [%s]\n", s));
-                       unlink_internals(conn, 0, file, False, False);
+                       unlink_internals(conn, NULL, 0, file, False);
                }
        }
        
@@ -4984,7 +4984,7 @@ static BOOL delete_driver_files( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info_3, struct
                                pstrcpy( file, p );
                                driver_unix_convert(file, conn, NULL, &st);
                                DEBUG(10,("deleting dependent file [%s]\n", file));
-                               unlink_internals(conn, 0, file, False, False);
+                               unlink_internals(conn, NULL, 0, file, False);
                        }
                        
                        i++;
index 0573599a81b5416dabff44b632d03bd0839d7f3f..1d370d3847b3182cb26d430a3b09c93f5e7163ea 100644 (file)
@@ -2089,11 +2089,11 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur
                goto error_exit;
        }
 
-       nt_status = open_file_stat(conn, r->in.file, &st, &fsp);
+       nt_status = open_file_stat(conn, NULL, r->in.file, &st, &fsp);
        if (!NT_STATUS_IS_OK(nt_status)) {
                /* Perhaps it is a directory */
                if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
-                       nt_status = open_directory(conn, r->in.file, &st,
+                       nt_status = open_directory(conn, NULL, r->in.file, &st,
                                        READ_CONTROL_ACCESS,
                                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                                        FILE_OPEN,
@@ -2194,12 +2194,12 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur
        }
 
 
-       nt_status = open_file_stat(conn, r->in.file, &st, &fsp);
+       nt_status = open_file_stat(conn, NULL, r->in.file, &st, &fsp);
 
        if (!NT_STATUS_IS_OK(nt_status)) {
                /* Perhaps it is a directory */
                if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
-                       nt_status = open_directory(conn, r->in.file, &st,
+                       nt_status = open_directory(conn, NULL, r->in.file, &st,
                                                FILE_READ_ATTRIBUTES,
                                                FILE_SHARE_READ|FILE_SHARE_WRITE,
                                                FILE_OPEN,
index db3e155ae4783ede8053bc89becba4225ff65796..e7baf2b759cb99a2fe7c006b4d58e29d4456af14 100644 (file)
@@ -879,7 +879,7 @@ static BOOL user_can_read_file(connection_struct *conn, char *name, SMB_STRUCT_S
        /* Pseudo-open the file (note - no fd's created). */
 
        if(S_ISDIR(pst->st_mode)) {
-                status = open_directory(conn, name, pst,
+                status = open_directory(conn, NULL, name, pst,
                        READ_CONTROL_ACCESS,
                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                        FILE_OPEN,
@@ -887,7 +887,7 @@ static BOOL user_can_read_file(connection_struct *conn, char *name, SMB_STRUCT_S
                        FILE_ATTRIBUTE_DIRECTORY,
                        NULL, &fsp);
        } else {
-               status = open_file_stat(conn, name, pst, &fsp);
+               status = open_file_stat(conn, NULL, name, pst, &fsp);
        }
 
        if (!NT_STATUS_IS_OK(status)) {
@@ -943,7 +943,7 @@ static BOOL user_can_write_file(connection_struct *conn, char *name, SMB_STRUCT_
        if(S_ISDIR(pst->st_mode)) {
                return True;
        } else {
-               status = open_file_ntcreate(conn, name, pst,
+               status = open_file_ntcreate(conn, NULL, name, pst,
                        FILE_WRITE_ATTRIBUTES,
                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                        FILE_OPEN,
index 2c259713c2cf9812a66778294f014c9b6eb36943..7e17e3b9380426f00c28a29758d686b8b63d930a 100644 (file)
@@ -505,6 +505,7 @@ int reply_ntcreate_and_X(connection_struct *conn,
        struct timespec m_timespec;
        BOOL extended_oplock_granted = False;
        NTSTATUS status;
+       struct smb_request req;
 
        START_PROFILE(SMBntcreateX);
 
@@ -520,6 +521,8 @@ int reply_ntcreate_and_X(connection_struct *conn,
                        (unsigned int)create_options,
                        (unsigned int)root_dir_fid ));
 
+       init_smb_request(&req, (uint8 *)inbuf);
+
        /*
         * If it's an IPC, use the pipe handler.
         */
@@ -726,7 +729,7 @@ int reply_ntcreate_and_X(connection_struct *conn,
                }
 
                oplock_request = 0;
-               status = open_directory(conn, fname, &sbuf,
+               status = open_directory(conn, &req, fname, &sbuf,
                                        access_mask,
                                        share_access,
                                        create_disposition,
@@ -764,7 +767,7 @@ int reply_ntcreate_and_X(connection_struct *conn,
                 * before issuing an oplock break request to
                 * our client. JRA.  */
 
-               status = open_file_ntcreate(conn,fname,&sbuf,
+               status = open_file_ntcreate(conn, &req, fname, &sbuf,
                                        access_mask,
                                        share_access,
                                        create_disposition,
@@ -807,7 +810,8 @@ int reply_ntcreate_and_X(connection_struct *conn,
                                }
        
                                oplock_request = 0;
-                               status = open_directory(conn, fname, &sbuf,
+                               status = open_directory(conn, &req, fname,
+                                                       &sbuf,
                                                        access_mask,
                                                        share_access,
                                                        create_disposition,
@@ -1199,6 +1203,7 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
        char *pdata = NULL;
        NTSTATUS status;
        size_t param_len;
+       struct smb_request req;
 
        DEBUG(5,("call_nt_transact_create\n"));
 
@@ -1227,6 +1232,8 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
                return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
        }
 
+       init_smb_request(&req, (uint8 *)inbuf);
+
        flags = IVAL(params,0);
        access_mask = IVAL(params,8);
        file_attributes = IVAL(params,20);
@@ -1389,16 +1396,6 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
                }
        }
 
-#if 0
-       /* We need to support SeSecurityPrivilege for this. */
-       if ((access_mask & SEC_RIGHT_SYSTEM_SECURITY)) && 
-                       !user_has_privileges(current_user.nt_user_token,
-                               &se_security)) {
-               restore_case_semantics(conn, file_attributes);
-               return ERROR_NT(NT_STATUS_PRIVILEGE_NOT_HELD);
-       }
-#endif
-
        if (ea_len) {
                pdata = data + sd_len;
 
@@ -1430,7 +1427,7 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
                 */
 
                oplock_request = 0;
-               status = open_directory(conn, fname, &sbuf,
+               status = open_directory(conn, &req, fname, &sbuf,
                                        access_mask,
                                        share_access,
                                        create_disposition,
@@ -1448,7 +1445,7 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
                 * Ordinary file case.
                 */
 
-               status = open_file_ntcreate(conn,fname,&sbuf,
+               status = open_file_ntcreate(conn,&req,fname,&sbuf,
                                        access_mask,
                                        share_access,
                                        create_disposition,
@@ -1471,7 +1468,8 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
                                }
        
                                oplock_request = 0;
-                               status = open_directory(conn, fname, &sbuf,
+                               status = open_directory(conn, &req, fname,
+                                                       &sbuf,
                                                        access_mask,
                                                        share_access,
                                                        create_disposition,
@@ -1691,7 +1689,9 @@ int reply_ntcancel(connection_struct *conn,
  Copy a file.
 ****************************************************************************/
 
-static NTSTATUS copy_internals(connection_struct *conn, char *oldname, char *newname, uint32 attrs)
+static NTSTATUS copy_internals(connection_struct *conn,
+                              struct smb_request *req,
+                              char *oldname, char *newname, uint32 attrs)
 {
        SMB_STRUCT_STAT sbuf1, sbuf2;
        pstring last_component_oldname;
@@ -1757,7 +1757,7 @@ static NTSTATUS copy_internals(connection_struct *conn, char *oldname, char *new
 
        DEBUG(10,("copy_internals: doing file copy %s to %s\n", oldname, newname));
 
-        status = open_file_ntcreate(conn,oldname,&sbuf1,
+        status = open_file_ntcreate(conn, req, oldname, &sbuf1,
                        FILE_READ_DATA, /* Read-only. */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                        FILE_OPEN,
@@ -1770,7 +1770,7 @@ static NTSTATUS copy_internals(connection_struct *conn, char *oldname, char *new
                return status;
        }
 
-        status = open_file_ntcreate(conn,newname,&sbuf2,
+        status = open_file_ntcreate(conn, req, newname, &sbuf2,
                        FILE_WRITE_DATA, /* Read-only. */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                        FILE_CREATE,
@@ -1834,9 +1834,12 @@ int reply_ntrename(connection_struct *conn,
        BOOL dest_has_wcard = False;
        uint32 attrs = SVAL(inbuf,smb_vwv0);
        uint16 rename_type = SVAL(inbuf,smb_vwv1);
+       struct smb_request req;
 
        START_PROFILE(SMBntrename);
 
+       init_smb_request(&req, (uint8 *)inbuf);
+
        p = smb_buf(inbuf) + 1;
        p += srvstr_get_path_wcard(inbuf, oldname, p, sizeof(oldname), 0, STR_TERMINATE, &status, &src_has_wcard);
        if (!NT_STATUS_IS_OK(status)) {
@@ -1884,7 +1887,9 @@ int reply_ntrename(connection_struct *conn,
        
        switch(rename_type) {
                case RENAME_FLAG_RENAME:
-                       status = rename_internals(conn, oldname, newname, attrs, False, src_has_wcard, dest_has_wcard);
+                       status = rename_internals(conn, &req, oldname, newname,
+                                                 attrs, False, src_has_wcard,
+                                                 dest_has_wcard);
                        break;
                case RENAME_FLAG_HARD_LINK:
                        if (src_has_wcard || dest_has_wcard) {
@@ -1899,7 +1904,8 @@ int reply_ntrename(connection_struct *conn,
                                /* No wildcards. */
                                status = NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
                        } else {
-                               status = copy_internals(conn, oldname, newname, attrs);
+                               status = copy_internals(conn, &req, oldname,
+                                                       newname, attrs);
                        }
                        break;
                case RENAME_FLAG_MOVE_CLUSTER_INFORMATION:
@@ -2036,6 +2042,9 @@ static int call_nt_transact_rename(connection_struct *conn, char *inbuf, char *o
        BOOL replace_if_exists = False;
        BOOL dest_has_wcard = False;
        NTSTATUS status;
+       struct smb_request req;
+
+       init_smb_request(&req, (uint8 *)inbuf);
 
         if(parameter_count < 5) {
                return ERROR_DOS(ERRDOS,ERRbadfunc);
@@ -2050,7 +2059,7 @@ static int call_nt_transact_rename(connection_struct *conn, char *inbuf, char *o
                return ERROR_NT(status);
        }
 
-       status = rename_internals(conn, fsp->fsp_name,
+       status = rename_internals(conn, &req, fsp->fsp_name,
                                  new_name, 0, replace_if_exists, False, dest_has_wcard);
 
        if (!NT_STATUS_IS_OK(status)) {
index 41fbce9889e394056835ec593d949e8595a7f67f..62a4fe080766d8eda81c825ce65ceeb5f9f5660d 100644 (file)
@@ -25,7 +25,6 @@
 extern struct generic_mapping file_generic_mapping;
 extern struct current_user current_user;
 extern userdom_struct current_user_info;
-extern uint16 global_smbpid;
 extern BOOL global_client_failed_oplock_break;
 
 struct deferred_open_record {
@@ -201,6 +200,7 @@ static void change_dir_owner_to_parent(connection_struct *conn,
 
 static NTSTATUS open_file(files_struct *fsp,
                          connection_struct *conn,
+                         struct smb_request *req,
                          const char *parent_dir,
                          const char *name,
                          const char *path,
@@ -359,8 +359,8 @@ static NTSTATUS open_file(files_struct *fsp,
 
        fsp->mode = psbuf->st_mode;
        fsp->file_id = file_id_sbuf(psbuf);
-       fsp->vuid = current_user.vuid;
-       fsp->file_pid = global_smbpid;
+       fsp->vuid = req ? req->vuid : UID_FIELD_INVALID;
+       fsp->file_pid = req ? req->smbpid : 0;
        fsp->can_lock = True;
        fsp->can_read = (access_mask & (FILE_READ_DATA)) ? True : False;
        if (!CAN_WRITE(conn)) {
@@ -871,6 +871,8 @@ static BOOL open_match_attributes(connection_struct *conn,
 static files_struct *fcb_or_dos_open(connection_struct *conn,
                                     const char *fname, 
                                     struct file_id id,
+                                    uint16 file_pid,
+                                    uint16 vuid,
                                     uint32 access_mask,
                                     uint32 share_access,
                                     uint32 create_options)
@@ -893,8 +895,8 @@ static files_struct *fcb_or_dos_open(connection_struct *conn,
                          (unsigned int)fsp->access_mask ));
 
                if (fsp->fh->fd != -1 &&
-                   fsp->vuid == current_user.vuid &&
-                   fsp->file_pid == global_smbpid &&
+                   fsp->vuid == vuid &&
+                   fsp->file_pid == file_pid &&
                    (fsp->fh->private_options & (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS |
                                                 NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) &&
                    (fsp->access_mask & FILE_WRITE_DATA) &&
@@ -1103,6 +1105,7 @@ static void schedule_defer_open(struct share_mode_lock *lck, struct timeval requ
 ****************************************************************************/
 
 NTSTATUS open_file_ntcreate(connection_struct *conn,
+                           struct smb_request *req,
                            const char *fname,
                            SMB_STRUCT_STAT *psbuf,
                            uint32 access_mask,         /* access bits (FILE_READ_DATA etc.) */
@@ -1129,7 +1132,6 @@ NTSTATUS open_file_ntcreate(connection_struct *conn,
        int info;
        uint32 existing_dos_attributes = 0;
        struct pending_message_list *pml = NULL;
-       uint16 mid = get_current_mid();
        struct timeval request_time = timeval_zero();
        struct share_mode_lock *lck = NULL;
        uint32 open_access_mask = access_mask;
@@ -1179,7 +1181,17 @@ NTSTATUS open_file_ntcreate(connection_struct *conn,
                   create_disposition, create_options, unx_mode,
                   oplock_request));
 
-       if ((pml = get_open_deferred_message(mid)) != NULL) {
+       if ((req == NULL) && ((oplock_request & INTERNAL_OPEN_ONLY) == 0)) {
+               DEBUG(0, ("No smb request but not an internal only open!\n"));
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       /*
+        * Only non-internal opens can be deferred at all
+        */
+
+       if ((req != NULL)
+           && ((pml = get_open_deferred_message(req->mid)) != NULL)) {
                struct deferred_open_record *state =
                        (struct deferred_open_record *)pml->private_data.data;
 
@@ -1194,12 +1206,12 @@ NTSTATUS open_file_ntcreate(connection_struct *conn,
                if (lck == NULL) {
                        DEBUG(0, ("could not get share mode lock\n"));
                } else {
-                       del_deferred_open_entry(lck, mid);
+                       del_deferred_open_entry(lck, req->mid);
                        TALLOC_FREE(lck);
                }
 
                /* Ensure we don't reprocess this message. */
-               remove_deferred_open_smb_message(mid);
+               remove_deferred_open_smb_message(req->mid);
        }
 
        status = check_name(conn, fname);
@@ -1477,9 +1489,19 @@ NTSTATUS open_file_ntcreate(connection_struct *conn,
                             NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) {
                                files_struct *fsp_dup;
 
+                               if (req == NULL) {
+                                       DEBUG(0, ("DOS open without an SMB "
+                                                 "request!\n"));
+                                       TALLOC_FREE(lck);
+                                       file_free(fsp);
+                                       return NT_STATUS_INTERNAL_ERROR;
+                               }
+
                                /* Use the client requested access mask here,
                                 * not the one we open with. */
                                fsp_dup = fcb_or_dos_open(conn, fname, id,
+                                                         req->smbpid,
+                                                         req->vuid,
                                                          access_mask,
                                                          share_access,
                                                          create_options);
@@ -1601,7 +1623,7 @@ NTSTATUS open_file_ntcreate(connection_struct *conn,
         * open_file strips any O_TRUNC flags itself.
         */
 
-       fsp_open = open_file(fsp, conn, parent_dir, newname, fname, psbuf,
+       fsp_open = open_file(fsp, conn, req, parent_dir, newname, fname, psbuf,
                             flags|flags2, unx_mode, access_mask,
                             open_access_mask);
 
@@ -1862,7 +1884,9 @@ NTSTATUS open_file_ntcreate(connection_struct *conn,
 
        /* If this is a successful open, we must remove any deferred open
         * records. */
-       del_deferred_open_entry(lck, mid);
+       if (req != NULL) {
+               del_deferred_open_entry(lck, req->mid);
+       }
        TALLOC_FREE(lck);
 
        conn->num_files_open++;
@@ -1892,8 +1916,8 @@ NTSTATUS open_file_fchmod(connection_struct *conn, const char *fname,
 
        /* note! we must use a non-zero desired access or we don't get
            a real file descriptor. Oh what a twisted web we weave. */
-       status = open_file(fsp, conn, NULL, NULL, fname, psbuf, O_WRONLY, 0,
-                          FILE_WRITE_DATA, FILE_WRITE_DATA);
+       status = open_file(fsp, conn, NULL, NULL, NULL, fname, psbuf, O_WRONLY,
+                          0, FILE_WRITE_DATA, FILE_WRITE_DATA);
 
        /* 
         * This is not a user visible file open.
@@ -2005,6 +2029,7 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
 ****************************************************************************/
 
 NTSTATUS open_directory(connection_struct *conn,
+                       struct smb_request *req,
                        const char *fname,
                        SMB_STRUCT_STAT *psbuf,
                        uint32 access_mask,
@@ -2121,8 +2146,8 @@ NTSTATUS open_directory(connection_struct *conn,
        
        fsp->mode = psbuf->st_mode;
        fsp->file_id = file_id_sbuf(psbuf);
-       fsp->vuid = current_user.vuid;
-       fsp->file_pid = global_smbpid;
+       fsp->vuid = req ? req->vuid : UID_FIELD_INVALID;
+       fsp->file_pid = req ? req->smbpid : 0;
        fsp->can_lock = False;
        fsp->can_read = False;
        fsp->can_write = False;
@@ -2200,7 +2225,7 @@ NTSTATUS create_directory(connection_struct *conn, const char *directory)
 
        SET_STAT_INVALID(sbuf);
        
-       status = open_directory(conn, directory, &sbuf,
+       status = open_directory(conn, NULL, directory, &sbuf,
                                FILE_READ_ATTRIBUTES, /* Just a stat open */
                                FILE_SHARE_NONE, /* Ignored for stat opens */
                                FILE_CREATE,
@@ -2220,8 +2245,9 @@ NTSTATUS create_directory(connection_struct *conn, const char *directory)
  Open a pseudo-file (no locking checks - a 'stat' open).
 ****************************************************************************/
 
-NTSTATUS open_file_stat(connection_struct *conn, const char *fname,
-                       SMB_STRUCT_STAT *psbuf, files_struct **result)
+NTSTATUS open_file_stat(connection_struct *conn, struct smb_request *req,
+                       const char *fname, SMB_STRUCT_STAT *psbuf,
+                       files_struct **result)
 {
        files_struct *fsp = NULL;
        NTSTATUS status;
@@ -2248,8 +2274,8 @@ NTSTATUS open_file_stat(connection_struct *conn, const char *fname,
        
        fsp->mode = psbuf->st_mode;
        fsp->file_id = file_id_sbuf(psbuf);
-       fsp->vuid = current_user.vuid;
-       fsp->file_pid = global_smbpid;
+       fsp->vuid = req ? req->vuid : UID_FIELD_INVALID;
+       fsp->file_pid = req ? req->smbpid : 0;
        fsp->can_lock = False;
        fsp->can_read = False;
        fsp->can_write = False;
index c4c4b2e393f2b3103f601988cb9824601d82c26d..947c30fb4a3231135fd07832b47fe9abd91fa021 100644 (file)
@@ -3195,13 +3195,14 @@ static NTSTATUS append_parent_acl(files_struct *fsp,
                        parent_name);
 
        status = open_directory(fsp->conn,
+                               NULL,
                                parent_name,
                                &sbuf,
                                FILE_READ_ATTRIBUTES, /* Just a stat open */
                                FILE_SHARE_NONE, /* Ignored for stat opens */
                                FILE_OPEN,
                                0,
-                               0,
+                               INTERNAL_OPEN_ONLY,
                                &info,
                                &parent_fsp);
 
index 3b922af51fedbf48c83f9a4e304da10a2f5ad509..dd623e69a5ffb18bbaa90cd392a5eb985634c6a2 100644 (file)
@@ -57,6 +57,18 @@ uint16 get_current_mid(void)
        return SVAL(InBuffer,smb_mid);
 }
 
+/*
+ * Initialize a struct smb_request from an inbuf
+ */
+
+void init_smb_request(struct smb_request *req, const uint8 *inbuf)
+{
+       req->flags2 = SVAL(inbuf, smb_flg2);
+       req->smbpid = SVAL(inbuf, smb_pid);
+       req->mid    = SVAL(inbuf, smb_mid);
+       req->vuid   = SVAL(inbuf, smb_uid);
+}
+
 /****************************************************************************
  structure to hold a linked list of queued messages.
  for processing.
index 41665e1676209cddc4dee47ccbe67e2c4cb22d77..76265ed464b07581fd763e78b8ab00cba0f01a02 100644 (file)
@@ -1263,7 +1263,11 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
        uint32 create_disposition;
        uint32 create_options = 0;
        NTSTATUS status;
+       struct smb_request req;
+
        START_PROFILE(SMBopen);
+
+       init_smb_request(&req, (uint8 *)inbuf);
  
        deny_mode = SVAL(inbuf,smb_vwv0);
 
@@ -1300,7 +1304,7 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
                return ERROR_NT(NT_STATUS_DOS(ERRDOS, ERRbadaccess));
        }
 
-       status = open_file_ntcreate(conn,fname,&sbuf,
+       status = open_file_ntcreate(conn, &req, fname, &sbuf,
                        access_mask,
                        share_mode,
                        create_disposition,
@@ -1383,9 +1387,12 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
        uint32 share_mode;
        uint32 create_disposition;
        uint32 create_options = 0;
+       struct smb_request req;
 
        START_PROFILE(SMBopenX);
 
+       init_smb_request(&req, (uint8 *)inbuf);
+
        /* If it's an IPC, pass off the pipe handler. */
        if (IS_IPC(conn)) {
                if (lp_nt_pipe_support()) {
@@ -1434,7 +1441,7 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
                return ERROR_NT(NT_STATUS_DOS(ERRDOS, ERRbadaccess));
        }
 
-       status = open_file_ntcreate(conn,fname,&sbuf,
+       status = open_file_ntcreate(conn, &req, fname, &sbuf,
                        access_mask,
                        share_mode,
                        create_disposition,
@@ -1576,8 +1583,11 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
        uint32 share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE;
        uint32 create_disposition;
        uint32 create_options = 0;
+       struct smb_request req;
 
        START_PROFILE(SMBcreate);
+
+       init_smb_request(&req, (uint8 *)inbuf);
  
        com = SVAL(inbuf,smb_com);
 
@@ -1623,7 +1633,7 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
        }
 
        /* Open file using ntcreate. */
-       status = open_file_ntcreate(conn,fname,&sbuf,
+       status = open_file_ntcreate(conn, &req, fname, &sbuf,
                                access_mask,
                                share_mode,
                                create_disposition,
@@ -1678,9 +1688,12 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
        char *p, *s;
        NTSTATUS status;
        unsigned int namelen;
+       struct smb_request req;
 
        START_PROFILE(SMBctemp);
 
+       init_smb_request(&req, (uint8 *)inbuf);
+
        srvstr_get_path(inbuf, fname, smb_buf(inbuf)+1, sizeof(fname), 0, STR_TERMINATE, &status);
        if (!NT_STATUS_IS_OK(status)) {
                END_PROFILE(SMBctemp);
@@ -1722,7 +1735,7 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
        SMB_VFS_STAT(conn,fname,&sbuf);
 
        /* We should fail if file does not exist. */
-       status = open_file_ntcreate(conn,fname,&sbuf,
+       status = open_file_ntcreate(conn, &req, fname, &sbuf,
                                FILE_GENERIC_READ | FILE_GENERIC_WRITE,
                                FILE_SHARE_READ|FILE_SHARE_WRITE,
                                FILE_OPEN,
@@ -1813,8 +1826,8 @@ static NTSTATUS can_rename(connection_struct *conn, files_struct *fsp,
  * unlink a file with all relevant access checks
  *******************************************************************/
 
-static NTSTATUS do_unlink(connection_struct *conn, char *fname,
-                         uint32 dirtype, BOOL can_defer)
+static NTSTATUS do_unlink(connection_struct *conn, struct smb_request *req,
+                         char *fname, uint32 dirtype)
 {
        SMB_STRUCT_STAT sbuf;
        uint32 fattr;
@@ -1906,13 +1919,13 @@ static NTSTATUS do_unlink(connection_struct *conn, char *fname,
        /* On open checks the open itself will check the share mode, so
           don't do it here as we'll get it wrong. */
 
-       status = open_file_ntcreate(conn, fname, &sbuf,
+       status = open_file_ntcreate(conn, req, fname, &sbuf,
                                    DELETE_ACCESS,
                                    FILE_SHARE_NONE,
                                    FILE_OPEN,
                                    0,
                                    FILE_ATTRIBUTE_NORMAL,
-                                   can_defer ? 0 : INTERNAL_OPEN_ONLY,
+                                   req != NULL ? 0 : INTERNAL_OPEN_ONLY,
                                    NULL, &fsp);
 
        if (!NT_STATUS_IS_OK(status)) {
@@ -1935,8 +1948,8 @@ static NTSTATUS do_unlink(connection_struct *conn, char *fname,
  code.
 ****************************************************************************/
 
-NTSTATUS unlink_internals(connection_struct *conn, uint32 dirtype,
-                         char *name, BOOL has_wild, BOOL can_defer)
+NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
+                         uint32 dirtype, char *name, BOOL has_wild)
 {
        pstring directory;
        pstring mask;
@@ -1986,7 +1999,7 @@ NTSTATUS unlink_internals(connection_struct *conn, uint32 dirtype,
                        return status;
                }
 
-               status = do_unlink(conn,directory,dirtype,can_defer);
+               status = do_unlink(conn, req, directory, dirtype);
                if (!NT_STATUS_IS_OK(status)) {
                        return status;
                }
@@ -2050,7 +2063,7 @@ NTSTATUS unlink_internals(connection_struct *conn, uint32 dirtype,
                                return status;
                        }
 
-                       status = do_unlink(conn, fname, dirtype, can_defer);
+                       status = do_unlink(conn, req, fname, dirtype);
                        if (!NT_STATUS_IS_OK(status)) {
                                continue;
                        }
@@ -2081,9 +2094,12 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
        uint32 dirtype;
        NTSTATUS status;
        BOOL path_contains_wcard = False;
+       struct smb_request req;
 
        START_PROFILE(SMBunlink);
 
+       init_smb_request(&req, (uint8 *)inbuf);
+
        dirtype = SVAL(inbuf,smb_vwv0);
        
        srvstr_get_path_wcard(inbuf, name, smb_buf(inbuf) + 1, sizeof(name), 0, STR_TERMINATE, &status, &path_contains_wcard);
@@ -2103,8 +2119,8 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
        
        DEBUG(3,("reply_unlink : %s\n",name));
        
-       status = unlink_internals(conn, dirtype, name, path_contains_wcard,
-                                 True);
+       status = unlink_internals(conn, &req, dirtype, name,
+                                 path_contains_wcard);
        if (!NT_STATUS_IS_OK(status)) {
                if (open_was_deferred(SVAL(inbuf,smb_mid))) {
                        /* We have re-scheduled this call. */
@@ -4467,7 +4483,7 @@ NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, pstrin
  code. 
 ****************************************************************************/
 
-NTSTATUS rename_internals(connection_struct *conn,
+NTSTATUS rename_internals(connection_struct *conn, struct smb_request *req,
                                pstring name,
                                pstring newname,
                                uint32 attrs,
@@ -4578,12 +4594,12 @@ NTSTATUS rename_internals(connection_struct *conn,
                SMB_VFS_STAT(conn, directory, &sbuf1);
 
                status = S_ISDIR(sbuf1.st_mode) ?
-                       open_directory(conn, directory, &sbuf1,
+                       open_directory(conn, req, directory, &sbuf1,
                                       DELETE_ACCESS,
                                       FILE_SHARE_READ|FILE_SHARE_WRITE,
                                       FILE_OPEN, 0, 0, NULL,
                                       &fsp)
-                       : open_file_ntcreate(conn, directory, &sbuf1,
+                       : open_file_ntcreate(conn, req, directory, &sbuf1,
                                             DELETE_ACCESS,
                                             FILE_SHARE_READ|FILE_SHARE_WRITE,
                                             FILE_OPEN, 0, 0, 0, NULL,
@@ -4674,12 +4690,12 @@ NTSTATUS rename_internals(connection_struct *conn,
                SMB_VFS_STAT(conn, fname, &sbuf1);
 
                status = S_ISDIR(sbuf1.st_mode) ?
-                       open_directory(conn, fname, &sbuf1,
+                       open_directory(conn, req, fname, &sbuf1,
                                       DELETE_ACCESS,
                                       FILE_SHARE_READ|FILE_SHARE_WRITE,
                                       FILE_OPEN, 0, 0, NULL,
                                       &fsp)
-                       : open_file_ntcreate(conn, fname, &sbuf1,
+                       : open_file_ntcreate(conn, req, fname, &sbuf1,
                                             DELETE_ACCESS,
                                             FILE_SHARE_READ|FILE_SHARE_WRITE,
                                             FILE_OPEN, 0, 0, 0, NULL,
@@ -4733,9 +4749,12 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
        NTSTATUS status;
        BOOL src_has_wcard = False;
        BOOL dest_has_wcard = False;
+       struct smb_request req;
 
        START_PROFILE(SMBmv);
 
+       init_smb_request(&req, (uint8 *)inbuf);
+
        p = smb_buf(inbuf) + 1;
        p += srvstr_get_path_wcard(inbuf, name, p, sizeof(name), 0, STR_TERMINATE, &status, &src_has_wcard);
        if (!NT_STATUS_IS_OK(status)) {
@@ -4769,7 +4788,8 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
        
        DEBUG(3,("reply_mv : %s -> %s\n",name,newname));
        
-       status = rename_internals(conn, name, newname, attrs, False, src_has_wcard, dest_has_wcard);
+       status = rename_internals(conn, &req, name, newname, attrs, False,
+                                 src_has_wcard, dest_has_wcard);
        if (!NT_STATUS_IS_OK(status)) {
                END_PROFILE(SMBmv);
                if (open_was_deferred(SVAL(inbuf,smb_mid))) {
@@ -4833,7 +4853,7 @@ NTSTATUS copy_file(connection_struct *conn,
                }
        }
 
-       status = open_file_ntcreate(conn,src,&src_sbuf,
+       status = open_file_ntcreate(conn, NULL, src, &src_sbuf,
                        FILE_GENERIC_READ,
                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                        FILE_OPEN,
@@ -4851,7 +4871,7 @@ NTSTATUS copy_file(connection_struct *conn,
                ZERO_STRUCTP(&sbuf2);
        }
 
-       status = open_file_ntcreate(conn,dest,&sbuf2,
+       status = open_file_ntcreate(conn, NULL, dest, &sbuf2,
                        FILE_GENERIC_WRITE,
                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                        new_create_disposition,
index af6bc413d9ff60750b65ac876bb880cbacb139de..8d4f505e09698f006ec15d800593607fbd1008dc 100644 (file)
@@ -740,9 +740,12 @@ int send_trans2_replies(const char *inbuf,
  Reply to a TRANSACT2_OPEN.
 ****************************************************************************/
 
-static int call_trans2open(connection_struct *conn, char *inbuf, char *outbuf, int bufsize,  
-                               char **pparams, int total_params, char **ppdata, int total_data,
-                               unsigned int max_data_bytes)
+static int call_trans2open(connection_struct *conn,
+                          struct smb_request *req,
+                          char *inbuf, char *outbuf, int bufsize,
+                          char **pparams, int total_params,
+                          char **ppdata, int total_data,
+                          unsigned int max_data_bytes)
 {
        char *params = *pparams;
        char *pdata = *ppdata;
@@ -859,7 +862,7 @@ static int call_trans2open(connection_struct *conn, char *inbuf, char *outbuf, i
                return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
        }
 
-       status = open_file_ntcreate(conn,fname,&sbuf,
+       status = open_file_ntcreate(conn, req, fname, &sbuf,
                access_mask,
                share_mode,
                create_disposition,
@@ -4299,6 +4302,7 @@ static NTSTATUS smb_set_file_dosmode(connection_struct *conn,
 ****************************************************************************/
 
 static NTSTATUS smb_set_file_size(connection_struct *conn,
+                                 struct smb_request *req,
                                files_struct *fsp,
                                const char *fname,
                                SMB_STRUCT_STAT *psbuf,
@@ -4328,7 +4332,7 @@ static NTSTATUS smb_set_file_size(connection_struct *conn,
                return NT_STATUS_OK;
        }
 
-       status = open_file_ntcreate(conn, fname, psbuf,
+       status = open_file_ntcreate(conn, req, fname, psbuf,
                                FILE_WRITE_DATA,
                                FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                                FILE_OPEN,
@@ -4603,6 +4607,7 @@ static NTSTATUS smb_set_file_unix_hlink(connection_struct *conn,
 ****************************************************************************/
 
 static NTSTATUS smb_file_rename_information(connection_struct *conn,
+                                           struct smb_request *req,
                                char *inbuf,
                                char *outbuf,
                                const char *pdata,
@@ -4664,7 +4669,8 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
        } else {
                DEBUG(10,("smb_file_rename_information: SMB_FILE_RENAME_INFORMATION %s -> %s\n",
                        fname, newname ));
-               status = rename_internals(conn, fname, base_name, 0, overwrite, False, dest_has_wcard);
+               status = rename_internals(conn, req, fname, base_name, 0,
+                                         overwrite, False, dest_has_wcard);
        }
 
        return status;
@@ -4955,6 +4961,7 @@ static NTSTATUS smb_set_file_basic_info(connection_struct *conn,
 ****************************************************************************/
 
 static NTSTATUS smb_set_file_allocation_info(connection_struct *conn,
+                                            struct smb_request *req,
                                        const char *pdata,
                                        int total_data,
                                        files_struct *fsp,
@@ -5007,7 +5014,7 @@ static NTSTATUS smb_set_file_allocation_info(connection_struct *conn,
 
        /* Pathname or stat or directory file. */
 
-       status = open_file_ntcreate(conn, fname, psbuf,
+       status = open_file_ntcreate(conn, req, fname, psbuf,
                                FILE_WRITE_DATA,
                                FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                                FILE_OPEN,
@@ -5035,6 +5042,7 @@ static NTSTATUS smb_set_file_allocation_info(connection_struct *conn,
 ****************************************************************************/
 
 static NTSTATUS smb_set_file_end_of_file_info(connection_struct *conn,
+                                             struct smb_request *req,
                                        const char *pdata,
                                        int total_data,
                                        files_struct *fsp,
@@ -5059,7 +5067,7 @@ static NTSTATUS smb_set_file_end_of_file_info(connection_struct *conn,
        DEBUG(10,("smb_set_file_end_of_file_info: Set end of file info for "
                "file %s to %.0f\n", fname, (double)size ));
 
-       return smb_set_file_size(conn,
+       return smb_set_file_size(conn, req,
                                fsp,
                                fname,
                                psbuf,
@@ -5155,6 +5163,7 @@ static NTSTATUS smb_unix_mknod(connection_struct *conn,
 ****************************************************************************/
 
 static NTSTATUS smb_set_file_unix_basic(connection_struct *conn,
+                                       struct smb_request *req,
                                        const char *pdata,
                                        int total_data,
                                        files_struct *fsp,
@@ -5306,7 +5315,7 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
 
        /* Deal with any size changes. */
 
-       status = smb_set_file_size(conn,
+       status = smb_set_file_size(conn, req,
                                fsp,
                                fname,
                                psbuf,
@@ -5329,6 +5338,7 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
 ****************************************************************************/
 
 static NTSTATUS smb_set_file_unix_info2(connection_struct *conn,
+                                       struct smb_request *req,
                                        const char *pdata,
                                        int total_data,
                                        files_struct *fsp,
@@ -5346,7 +5356,7 @@ static NTSTATUS smb_set_file_unix_info2(connection_struct *conn,
        /* Start by setting all the fields that are common between UNIX_BASIC
         * and UNIX_INFO2.
         */
-       status = smb_set_file_unix_basic(conn, pdata, total_data,
+       status = smb_set_file_unix_basic(conn, req, pdata, total_data,
                                fsp, fname, psbuf);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
@@ -5390,6 +5400,7 @@ static NTSTATUS smb_set_file_unix_info2(connection_struct *conn,
 ****************************************************************************/
 
 static NTSTATUS smb_posix_mkdir(connection_struct *conn,
+                               struct smb_request *req,
                                char **ppdata,
                                int total_data,
                                const char *fname,
@@ -5422,7 +5433,7 @@ static NTSTATUS smb_posix_mkdir(connection_struct *conn,
        DEBUG(10,("smb_posix_mkdir: file %s, mode 0%o\n",
                fname, (unsigned int)unixmode ));
 
-       status = open_directory(conn,
+       status = open_directory(conn, req,
                                fname,
                                psbuf,
                                FILE_READ_ATTRIBUTES, /* Just a stat open */
@@ -5484,6 +5495,7 @@ static NTSTATUS smb_posix_mkdir(connection_struct *conn,
 ****************************************************************************/
 
 static NTSTATUS smb_posix_open(connection_struct *conn,
+                              struct smb_request *req,
                                char **ppdata,
                                int total_data,
                                const char *fname,
@@ -5519,7 +5531,7 @@ static NTSTATUS smb_posix_open(connection_struct *conn,
        wire_open_mode = IVAL(pdata,4);
 
        if (wire_open_mode == (SMB_O_CREAT|SMB_O_DIRECTORY)) {
-               return smb_posix_mkdir(conn,
+               return smb_posix_mkdir(conn, req,
                                        ppdata,
                                        total_data,
                                        fname,
@@ -5587,7 +5599,7 @@ static NTSTATUS smb_posix_open(connection_struct *conn,
                (unsigned int)wire_open_mode,
                (unsigned int)unixmode ));
 
-       status = open_file_ntcreate(conn,
+       status = open_file_ntcreate(conn, req,
                                fname,
                                psbuf,
                                access_mask,
@@ -5671,6 +5683,7 @@ static NTSTATUS smb_posix_open(connection_struct *conn,
 ****************************************************************************/
 
 static NTSTATUS smb_posix_unlink(connection_struct *conn,
+                                struct smb_request *req,
                                const char *pdata,
                                int total_data,
                                const char *fname,
@@ -5701,7 +5714,7 @@ static NTSTATUS smb_posix_unlink(connection_struct *conn,
                fname));
 
        if (VALID_STAT_OF_DIR(*psbuf)) {
-               status = open_directory(conn,
+               status = open_directory(conn, req,
                                        fname,
                                        psbuf,
                                        DELETE_ACCESS,
@@ -5714,7 +5727,7 @@ static NTSTATUS smb_posix_unlink(connection_struct *conn,
        } else {
                char del = 1;
 
-               status = open_file_ntcreate(conn,
+               status = open_file_ntcreate(conn, req,
                                fname,
                                psbuf,
                                DELETE_ACCESS,
@@ -5752,7 +5765,10 @@ static NTSTATUS smb_posix_unlink(connection_struct *conn,
  Reply to a TRANS2_SETFILEINFO (set file info by fileid or pathname).
 ****************************************************************************/
 
-static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char *outbuf, int length, int bufsize,
+static int call_trans2setfilepathinfo(connection_struct *conn,
+                                     struct smb_request *req,
+                                     char *inbuf, char *outbuf, int length,
+                                     int bufsize,
                                        unsigned int tran_call,
                                        char **pparams, int total_params, char **ppdata, int total_data,
                                        unsigned int max_data_bytes)
@@ -5933,7 +5949,7 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
                case SMB_FILE_ALLOCATION_INFORMATION:
                case SMB_SET_FILE_ALLOCATION_INFO:
                {
-                       status = smb_set_file_allocation_info(conn,
+                       status = smb_set_file_allocation_info(conn, req,
                                                                pdata,
                                                                total_data,
                                                                fsp,
@@ -5945,7 +5961,7 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
                case SMB_FILE_END_OF_FILE_INFORMATION:
                case SMB_SET_FILE_END_OF_FILE_INFO:
                {
-                       status = smb_set_file_end_of_file_info(conn,
+                       status = smb_set_file_end_of_file_info(conn, req,
                                                                pdata,
                                                                total_data,
                                                                fsp,
@@ -6004,7 +6020,7 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
 
                case SMB_SET_FILE_UNIX_BASIC:
                {
-                       status = smb_set_file_unix_basic(conn,
+                       status = smb_set_file_unix_basic(conn, req,
                                                        pdata,
                                                        total_data,
                                                        fsp,
@@ -6015,7 +6031,7 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
 
                case SMB_SET_FILE_UNIX_INFO2:
                {
-                       status = smb_set_file_unix_info2(conn,
+                       status = smb_set_file_unix_info2(conn, req,
                                                        pdata,
                                                        total_data,
                                                        fsp,
@@ -6055,7 +6071,7 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
 
                case SMB_FILE_RENAME_INFORMATION:
                {
-                       status = smb_file_rename_information(conn,
+                       status = smb_file_rename_information(conn, req,
                                                        inbuf,
                                                        outbuf,
                                                        pdata,
@@ -6099,7 +6115,7 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
                                return ERROR_NT(NT_STATUS_INVALID_LEVEL);
                        }
 
-                       status = smb_posix_open(conn,
+                       status = smb_posix_open(conn, req,
                                                ppdata,
                                                total_data,
                                                fname,
@@ -6115,7 +6131,7 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
                                return ERROR_NT(NT_STATUS_INVALID_LEVEL);
                        }
 
-                       status = smb_posix_unlink(conn,
+                       status = smb_posix_unlink(conn, req,
                                                pdata,
                                                total_data,
                                                fname,
@@ -6451,9 +6467,9 @@ int reply_findnclose(connection_struct *conn,
        return(outsize);
 }
 
-int handle_trans2(connection_struct *conn,
-                 struct trans_state *state,
-                 char *inbuf, char *outbuf, int size, int bufsize)
+static int handle_trans2(connection_struct *conn, struct smb_request *req,
+                        struct trans_state *state,
+                        char *inbuf, char *outbuf, int size, int bufsize)
 {
        int outsize;
 
@@ -6467,7 +6483,7 @@ int handle_trans2(connection_struct *conn,
        {
                START_PROFILE(Trans2_open);
                outsize = call_trans2open(
-                       conn, inbuf, outbuf, bufsize, 
+                       conn, req, inbuf, outbuf, bufsize,
                        &state->param, state->total_param,
                        &state->data, state->total_data,
                        state->max_data_return);
@@ -6541,7 +6557,7 @@ int handle_trans2(connection_struct *conn,
        {
                START_PROFILE(Trans2_setpathinfo);
                outsize = call_trans2setfilepathinfo(
-                       conn, inbuf, outbuf, size, bufsize, state->call,
+                       conn, req, inbuf, outbuf, size, bufsize, state->call,
                        &state->param, state->total_param,
                        &state->data, state->total_data,
                        state->max_data_return);
@@ -6749,7 +6765,10 @@ int reply_trans2(connection_struct *conn, char *inbuf,char *outbuf,
        if ((state->received_param == state->total_param) &&
            (state->received_data == state->total_data)) {
 
-               outsize = handle_trans2(conn, state, inbuf, outbuf,
+               struct smb_request req;
+               init_smb_request(&req, (uint8 *)inbuf);
+
+               outsize = handle_trans2(conn, &req, state, inbuf, outbuf,
                                        size, bufsize);
                SAFE_FREE(state->data);
                SAFE_FREE(state->param);
@@ -6788,6 +6807,7 @@ int reply_transs2(connection_struct *conn,
        int outsize = 0;
        unsigned int pcnt,poff,dcnt,doff,pdisp,ddisp;
        struct trans_state *state;
+       struct smb_request req;
 
        START_PROFILE(SMBtranss2);
 
@@ -6873,7 +6893,10 @@ int reply_transs2(connection_struct *conn,
         */
        SCVAL(outbuf,smb_com,SMBtrans2);
 
-       outsize = handle_trans2(conn, state, inbuf, outbuf, size, bufsize);
+       init_smb_request(&req, (uint8 *)inbuf);
+
+       outsize = handle_trans2(conn, &req, state, inbuf, outbuf, size,
+                               bufsize);
 
        DLIST_REMOVE(conn->pending_trans, state);
        SAFE_FREE(state->data);