summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/smb_server/smb2/receive.c13
-rw-r--r--source4/smb_server/smb2/smb2_server.h2
2 files changed, 15 insertions, 0 deletions
diff --git a/source4/smb_server/smb2/receive.c b/source4/smb_server/smb2/receive.c
index 7463712cd4..0ebf8f31a1 100644
--- a/source4/smb_server/smb2/receive.c
+++ b/source4/smb_server/smb2/receive.c
@@ -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
diff --git a/source4/smb_server/smb2/smb2_server.h b/source4/smb_server/smb2/smb2_server.h
index 7fb09f6873..5fe12feae0 100644
--- a/source4/smb_server/smb2/smb2_server.h
+++ b/source4/smb_server/smb2/smb2_server.h
@@ -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;