s4:smb_server/smb2: correctly implement related compound requests
authorStefan Metzmacher <metze@samba.org>
Mon, 31 Oct 2011 14:23:00 +0000 (15:23 +0100)
committerStefan Metzmacher <metze@samba.org>
Mon, 31 Oct 2011 18:39:04 +0000 (19:39 +0100)
We need to remember the session id and tree id.

metze

source4/smb_server/smb2/receive.c
source4/smb_server/smb2/smb2_server.h

index 7463712cd423373e36d52ff21e767b68626454b5..0ebf8f31a10edef8e3a31adb5c6ae696ef5abecc 100644 (file)
@@ -69,6 +69,9 @@ struct smb2srv_request *smb2srv_init_request(struct smbsrv_connection *smb_conn)
 
        req->smb_conn = smb_conn;
 
+       req->chained_session_id = UINT64_MAX;
+       req->chained_tree_id = UINT32_MAX;
+
        talloc_set_destructor(req, smb2srv_request_destructor);
 
        return req;
@@ -233,6 +236,8 @@ static void smb2srv_chain_reply(struct smb2srv_request *p_req)
                               sizeof(req->_chained_file_handle));
                        req->chained_file_handle = req->_chained_file_handle;
                }
+               req->chained_session_id = p_req->chained_session_id;
+               req->chained_tree_id = p_req->chained_tree_id;
                req->chain_status = p_req->chain_status;
        }
 
@@ -342,9 +347,17 @@ static NTSTATUS smb2srv_reply(struct smb2srv_request *req)
                req->smb_conn->highest_smb2_seqnum = req->seqnum;
        }
 
+       if (flags & SMB2_HDR_FLAG_CHAINED) {
+               uid = req->chained_session_id;
+               tid = req->chained_tree_id;
+       }
+
        req->session    = smbsrv_session_find(req->smb_conn, uid, req->request_time);
        req->tcon       = smbsrv_smb2_tcon_find(req->session, tid, req->request_time);
 
+       req->chained_session_id = uid;
+       req->chained_tree_id = tid;
+
        errno = 0;
 
        /* supporting signing is mandatory in SMB2, and is per-packet. So we 
index 7fb09f68736cd1dda3bf9ac1ada5cc564286b22d..5fe12feae0963170d66a9d19b33fb2625d28eb47 100644 (file)
@@ -64,6 +64,8 @@ struct smb2srv_request {
        /* chained file handle */
        uint8_t _chained_file_handle[16];
        uint8_t *chained_file_handle;
+       uint64_t chained_session_id;
+       uint32_t chained_tree_id;
 
        bool is_signed;