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_getinfo.c

    r745 r751  
    3030                                                 struct tevent_context *ev,
    3131                                                 struct smbd_smb2_request *smb2req,
     32                                                 struct files_struct *in_fsp,
    3233                                                 uint8_t in_info_type,
    3334                                                 uint8_t in_file_info_class,
     
    3536                                                 DATA_BLOB in_input_buffer,
    3637                                                 uint32_t in_additional_information,
    37                                                  uint32_t in_flags,
    38                                                  uint64_t in_file_id_volatile);
     38                                                 uint32_t in_flags);
    3939static NTSTATUS smbd_smb2_getinfo_recv(struct tevent_req *req,
    4040                                       TALLOC_CTX *mem_ctx,
     
    4545NTSTATUS smbd_smb2_request_process_getinfo(struct smbd_smb2_request *req)
    4646{
    47         const uint8_t *inhdr;
     47        NTSTATUS status;
    4848        const uint8_t *inbody;
    4949        int i = req->current_idx;
    50         size_t expected_body_size = 0x29;
    51         size_t body_size;
    5250        uint8_t in_info_type;
    5351        uint8_t in_file_info_class;
     
    6058        uint64_t in_file_id_persistent;
    6159        uint64_t in_file_id_volatile;
     60        struct files_struct *in_fsp;
    6261        struct tevent_req *subreq;
    6362
    64         inhdr = (const uint8_t *)req->in.vector[i+0].iov_base;
    65         if (req->in.vector[i+1].iov_len != (expected_body_size & 0xFFFFFFFE)) {
    66                 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
    67         }
    68 
     63        status = smbd_smb2_request_verify_sizes(req, 0x29);
     64        if (!NT_STATUS_IS_OK(status)) {
     65                return smbd_smb2_request_error(req, status);
     66        }
    6967        inbody = (const uint8_t *)req->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(req, NT_STATUS_INVALID_PARAMETER);
    74         }
    7568
    7669        in_info_type                    = CVAL(inbody, 0x02);
     
    8881                /* This is ok */
    8982        } else if (in_input_buffer_offset !=
    90                    (SMB2_HDR_BODY + (body_size & 0xFFFFFFFE))) {
     83                   (SMB2_HDR_BODY + req->in.vector[i+1].iov_len)) {
    9184                return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
    9285        }
     
    9992        in_input_buffer.length = in_input_buffer_length;
    10093
    101         if (req->compat_chain_fsp) {
    102                 /* skip check */
    103         } else if (in_file_id_persistent != in_file_id_volatile) {
     94        if (in_input_buffer.length > req->sconn->smb2.max_trans) {
     95                return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
     96        }
     97        if (in_output_buffer_length > req->sconn->smb2.max_trans) {
     98                return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
     99        }
     100
     101        in_fsp = file_fsp_smb2(req, in_file_id_persistent, in_file_id_volatile);
     102        if (in_fsp == NULL) {
    104103                return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
    105104        }
    106105
    107         subreq = smbd_smb2_getinfo_send(req,
    108                                         req->sconn->smb2.event_ctx,
    109                                         req,
     106        subreq = smbd_smb2_getinfo_send(req, req->sconn->smb2.event_ctx,
     107                                        req, in_fsp,
    110108                                        in_info_type,
    111109                                        in_file_info_class,
     
    113111                                        in_input_buffer,
    114112                                        in_additional_information,
    115                                         in_flags,
    116                                         in_file_id_volatile);
     113                                        in_flags);
    117114        if (subreq == NULL) {
    118115                return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY);
     
    236233                                                 struct tevent_context *ev,
    237234                                                 struct smbd_smb2_request *smb2req,
     235                                                 struct files_struct *fsp,
    238236                                                 uint8_t in_info_type,
    239237                                                 uint8_t in_file_info_class,
     
    241239                                                 DATA_BLOB in_input_buffer,
    242240                                                 uint32_t in_additional_information,
    243                                                  uint32_t in_flags,
    244                                                  uint64_t in_file_id_volatile)
     241                                                 uint32_t in_flags)
    245242{
    246243        struct tevent_req *req;
     
    248245        struct smb_request *smbreq;
    249246        connection_struct *conn = smb2req->tcon->compat_conn;
    250         files_struct *fsp;
    251247        NTSTATUS status;
    252248
     
    260256        state->out_output_buffer = data_blob_null;
    261257
    262         DEBUG(10,("smbd_smb2_getinfo_send: file_id[0x%016llX]\n",
    263                   (unsigned long long)in_file_id_volatile));
     258        DEBUG(10,("smbd_smb2_getinfo_send: %s - fnum[%d]\n",
     259                  fsp_str_dbg(fsp), fsp->fnum));
    264260
    265261        smbreq = smbd_smb2_fake_smb_request(smb2req);
    266262        if (tevent_req_nomem(smbreq, req)) {
    267                 return tevent_req_post(req, ev);
    268         }
    269 
    270         fsp = file_fsp(smbreq, (uint16_t)in_file_id_volatile);
    271         if (fsp == NULL) {
    272                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    273                 return tevent_req_post(req, ev);
    274         }
    275         if (conn != fsp->conn) {
    276                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    277                 return tevent_req_post(req, ev);
    278         }
    279         if (smb2req->session->vuid != fsp->vuid) {
    280                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    281263                return tevent_req_post(req, ev);
    282264        }
Note: See TracChangeset for help on using the changeset viewer.