Changeset 751 for trunk/server/source3/smbd/smb2_sesssetup.c
- Timestamp:
- Nov 29, 2012, 1:59:04 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server/source3/smbd/smb2_sesssetup.c
r745 r751 48 48 DATA_BLOB outbody; 49 49 DATA_BLOB outdyn; 50 size_t expected_body_size = 0x19;51 size_t body_size;52 50 uint64_t in_session_id; 53 51 uint8_t in_security_mode; … … 58 56 uint64_t out_session_id; 59 57 uint16_t out_security_offset; 60 DATA_BLOB out_security_buffer ;58 DATA_BLOB out_security_buffer = data_blob_null; 61 59 NTSTATUS status; 62 60 61 status = smbd_smb2_request_verify_sizes(smb2req, 0x19); 62 if (!NT_STATUS_IS_OK(status)) { 63 return smbd_smb2_request_error(smb2req, status); 64 } 63 65 inhdr = (const uint8_t *)smb2req->in.vector[i+0].iov_base; 64 65 if (smb2req->in.vector[i+1].iov_len != (expected_body_size & 0xFFFFFFFE)) {66 return smbd_smb2_request_error(smb2req, NT_STATUS_INVALID_PARAMETER);67 }68 69 66 inbody = (const uint8_t *)smb2req->in.vector[i+1].iov_base; 70 71 body_size = SVAL(inbody, 0x00);72 if (body_size != expected_body_size) {73 return smbd_smb2_request_error(smb2req, NT_STATUS_INVALID_PARAMETER);74 }75 67 76 68 in_security_offset = SVAL(inbody, 0x0C); 77 69 in_security_length = SVAL(inbody, 0x0E); 78 70 79 if (in_security_offset != (SMB2_HDR_BODY + (body_size & 0xFFFFFFFE))) {71 if (in_security_offset != (SMB2_HDR_BODY + smb2req->in.vector[i+1].iov_len)) { 80 72 return smbd_smb2_request_error(smb2req, NT_STATUS_INVALID_PARAMETER); 81 73 } … … 196 188 bool username_was_mapped = false; 197 189 bool map_domainuser_to_guest = false; 190 bool guest = false; 198 191 199 192 if (!spnego_parse_krb5_wrap(talloc_tos(), *secblob, &ticket, tok_id)) { … … 272 265 /* force no signing */ 273 266 session->do_signing = false; 267 guest = true; 274 268 } 275 269 … … 324 318 */ 325 319 smb2req->session = session; 326 if ( session->do_signing) {320 if (!guest) { 327 321 smb2req->do_signing = true; 328 322 } … … 478 472 { 479 473 fstring tmp; 474 bool guest = false; 480 475 481 476 if ((in_security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) || … … 490 485 /* force no signing */ 491 486 session->do_signing = false; 487 guest = true; 492 488 } 493 489 … … 537 533 */ 538 534 smb2req->session = session; 539 if ( session->do_signing) {535 if (!guest) { 540 536 smb2req->do_signing = true; 541 537 } … … 565 561 } 566 562 567 if (auth. data[0] == ASN1_APPLICATION(0)) {563 if (auth.length > 0 && auth.data[0] == ASN1_APPLICATION(0)) { 568 564 /* Might be a second negTokenTarg packet */ 569 565 DATA_BLOB secblob_in = data_blob_null; … … 679 675 NTSTATUS status; 680 676 DATA_BLOB secblob_out = data_blob_null; 677 678 *out_security_buffer = data_blob_null; 681 679 682 680 if (session->auth_ntlmssp_state == NULL) { … … 820 818 { 821 819 const uint8_t *inhdr; 822 const uint8_t *outhdr;823 820 int i = req->current_idx; 821 uint32_t in_flags; 824 822 uint64_t in_session_id; 825 823 void *p; 826 824 struct smbd_smb2_session *session; 827 bool chained_fixup = false; 825 826 req->session = NULL; 827 req->tcon = NULL; 828 828 829 829 inhdr = (const uint8_t *)req->in.vector[i+0].iov_base; 830 830 831 in_flags = IVAL(inhdr, SMB2_HDR_FLAGS); 831 832 in_session_id = BVAL(inhdr, SMB2_HDR_SESSION_ID); 832 833 833 if (in_session_id == (0xFFFFFFFFFFFFFFFFLL)) { 834 if (req->async) { 835 /* 836 * async request - fill in session_id from 837 * already setup request out.vector[].iov_base. 838 */ 839 outhdr = (const uint8_t *)req->out.vector[i].iov_base; 840 in_session_id = BVAL(outhdr, SMB2_HDR_SESSION_ID); 841 } else if (i > 2) { 842 /* 843 * Chained request - fill in session_id from 844 * the previous request out.vector[].iov_base. 845 */ 846 outhdr = (const uint8_t *)req->out.vector[i-3].iov_base; 847 in_session_id = BVAL(outhdr, SMB2_HDR_SESSION_ID); 848 chained_fixup = true; 849 } 850 } 834 if (in_flags & SMB2_HDR_FLAG_CHAINED) { 835 in_session_id = req->last_session_id; 836 } 837 838 req->last_session_id = UINT64_MAX; 851 839 852 840 /* lookup an existing session */ … … 866 854 867 855 req->session = session; 868 869 if (chained_fixup) { 870 /* Fix up our own outhdr. */ 871 outhdr = (const uint8_t *)req->out.vector[i].iov_base; 872 SBVAL(outhdr, SMB2_HDR_SESSION_ID, in_session_id); 873 } 856 req->last_session_id = in_session_id; 857 874 858 return NT_STATUS_OK; 875 859 } … … 877 861 NTSTATUS smbd_smb2_request_process_logoff(struct smbd_smb2_request *req) 878 862 { 879 const uint8_t *inbody; 880 int i = req->current_idx; 863 NTSTATUS status; 881 864 DATA_BLOB outbody; 882 size_t expected_body_size = 0x04; 883 size_t body_size; 884 885 if (req->in.vector[i+1].iov_len != (expected_body_size & 0xFFFFFFFE)) { 886 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); 887 } 888 889 inbody = (const uint8_t *)req->in.vector[i+1].iov_base; 890 891 body_size = SVAL(inbody, 0x00); 892 if (body_size != expected_body_size) { 893 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); 865 866 status = smbd_smb2_request_verify_sizes(req, 0x04); 867 if (!NT_STATUS_IS_OK(status)) { 868 return smbd_smb2_request_error(req, status); 894 869 } 895 870
Note:
See TracChangeset
for help on using the changeset viewer.