summaryrefslogtreecommitdiff
path: root/source3/smbd/smb2_sesssetup.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2009-05-20 20:51:10 +0200
committerStefan Metzmacher <metze@samba.org>2009-05-20 20:53:39 +0200
commit5d3d51e9ad1e4db8d9580ce7f2ba4e86e658bb13 (patch)
treed577106b310f0269754306eff812ee81231c8e6b /source3/smbd/smb2_sesssetup.c
parent1ecdc8588da2eddfe673f736f519d37eac4be911 (diff)
downloadsamba-5d3d51e9ad1e4db8d9580ce7f2ba4e86e658bb13.tar.gz
samba-5d3d51e9ad1e4db8d9580ce7f2ba4e86e658bb13.tar.bz2
samba-5d3d51e9ad1e4db8d9580ce7f2ba4e86e658bb13.zip
s3:smbd: check the incoming session id for SMB2 requests
metze
Diffstat (limited to 'source3/smbd/smb2_sesssetup.c')
-rw-r--r--source3/smbd/smb2_sesssetup.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c
index 6c4da393e1..d322223ad5 100644
--- a/source3/smbd/smb2_sesssetup.c
+++ b/source3/smbd/smb2_sesssetup.c
@@ -180,6 +180,11 @@ static NTSTATUS smbd_smb2_session_setup(struct smbd_smb2_request *req,
} else if (NT_STATUS_IS_OK(status)) {
/* TODO: setup session key for signing */
session->status = NT_STATUS_OK;
+ /*
+ * we attach the session to the request
+ * so that the response can be signed
+ */
+ req->session = session;
} else {
return status;
}
@@ -188,3 +193,29 @@ static NTSTATUS smbd_smb2_session_setup(struct smbd_smb2_request *req,
return status;
}
+NTSTATUS smbd_smb2_request_check_session(struct smbd_smb2_request *req)
+{
+ const uint8_t *inhdr;
+ int i = req->current_idx;
+ uint64_t in_session_id;
+ void *p;
+ struct smbd_smb2_session *session;
+
+ inhdr = (const uint8_t *)req->in.vector[i+0].iov_base;
+
+ in_session_id = SVAL(inhdr, SMB2_HDR_SESSION_ID);
+
+ /* lookup an existing session */
+ p = idr_find(req->conn->smb2.sessions.idtree, in_session_id);
+ if (p == NULL) {
+ return NT_STATUS_USER_SESSION_DELETED;
+ }
+ session = talloc_get_type_abort(p, struct smbd_smb2_session);
+
+ if (!NT_STATUS_IS_OK(session->status)) {
+ return NT_STATUS_ACCESS_DENIED;
+ }
+
+ req->session = session;
+ return NT_STATUS_OK;
+}