Ignore:
Timestamp:
Nov 29, 2012, 1:59:04 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.9

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server/source3/smbd/smb2_sesssetup.c

    r745 r751  
    4848        DATA_BLOB outbody;
    4949        DATA_BLOB outdyn;
    50         size_t expected_body_size = 0x19;
    51         size_t body_size;
    5250        uint64_t in_session_id;
    5351        uint8_t in_security_mode;
     
    5856        uint64_t out_session_id;
    5957        uint16_t out_security_offset;
    60         DATA_BLOB out_security_buffer;
     58        DATA_BLOB out_security_buffer = data_blob_null;
    6159        NTSTATUS status;
    6260
     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        }
    6365        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 
    6966        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         }
    7567
    7668        in_security_offset = SVAL(inbody, 0x0C);
    7769        in_security_length = SVAL(inbody, 0x0E);
    7870
    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)) {
    8072                return smbd_smb2_request_error(smb2req, NT_STATUS_INVALID_PARAMETER);
    8173        }
     
    196188        bool username_was_mapped = false;
    197189        bool map_domainuser_to_guest = false;
     190        bool guest = false;
    198191
    199192        if (!spnego_parse_krb5_wrap(talloc_tos(), *secblob, &ticket, tok_id)) {
     
    272265                /* force no signing */
    273266                session->do_signing = false;
     267                guest = true;
    274268        }
    275269
     
    324318         */
    325319        smb2req->session = session;
    326         if (session->do_signing) {
     320        if (!guest) {
    327321                smb2req->do_signing = true;
    328322        }
     
    478472{
    479473        fstring tmp;
     474        bool guest = false;
    480475
    481476        if ((in_security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) ||
     
    490485                /* force no signing */
    491486                session->do_signing = false;
     487                guest = true;
    492488        }
    493489
     
    537533         */
    538534        smb2req->session = session;
    539         if (session->do_signing) {
     535        if (!guest) {
    540536                smb2req->do_signing = true;
    541537        }
     
    565561        }
    566562
    567         if (auth.data[0] == ASN1_APPLICATION(0)) {
     563        if (auth.length > 0 && auth.data[0] == ASN1_APPLICATION(0)) {
    568564                /* Might be a second negTokenTarg packet */
    569565                DATA_BLOB secblob_in = data_blob_null;
     
    679675        NTSTATUS status;
    680676        DATA_BLOB secblob_out = data_blob_null;
     677
     678        *out_security_buffer = data_blob_null;
    681679
    682680        if (session->auth_ntlmssp_state == NULL) {
     
    820818{
    821819        const uint8_t *inhdr;
    822         const uint8_t *outhdr;
    823820        int i = req->current_idx;
     821        uint32_t in_flags;
    824822        uint64_t in_session_id;
    825823        void *p;
    826824        struct smbd_smb2_session *session;
    827         bool chained_fixup = false;
     825
     826        req->session = NULL;
     827        req->tcon = NULL;
    828828
    829829        inhdr = (const uint8_t *)req->in.vector[i+0].iov_base;
    830830
     831        in_flags = IVAL(inhdr, SMB2_HDR_FLAGS);
    831832        in_session_id = BVAL(inhdr, SMB2_HDR_SESSION_ID);
    832833
    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;
    851839
    852840        /* lookup an existing session */
     
    866854
    867855        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
    874858        return NT_STATUS_OK;
    875859}
     
    877861NTSTATUS smbd_smb2_request_process_logoff(struct smbd_smb2_request *req)
    878862{
    879         const uint8_t *inbody;
    880         int i = req->current_idx;
     863        NTSTATUS status;
    881864        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);
    894869        }
    895870
Note: See TracChangeset for help on using the changeset viewer.