diff options
author | Stefan Metzmacher <metze@samba.org> | 2009-05-20 20:51:10 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-05-20 20:53:39 +0200 |
commit | 5d3d51e9ad1e4db8d9580ce7f2ba4e86e658bb13 (patch) | |
tree | d577106b310f0269754306eff812ee81231c8e6b /source3/smbd/smb2_sesssetup.c | |
parent | 1ecdc8588da2eddfe673f736f519d37eac4be911 (diff) | |
download | samba-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.c | 31 |
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; +} |