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

    r745 r751  
    2929                                              struct tevent_context *ev,
    3030                                              struct smbd_smb2_request *smb2req,
     31                                              struct files_struct *in_fsp,
    3132                                              uint8_t in_file_info_class,
    3233                                              uint8_t in_flags,
    3334                                              uint32_t in_file_index,
    34                                               uint64_t in_file_id_volatile,
    3535                                              uint32_t in_output_buffer_length,
    3636                                              const char *in_file_name);
     
    4242NTSTATUS smbd_smb2_request_process_find(struct smbd_smb2_request *req)
    4343{
    44         const uint8_t *inhdr;
     44        NTSTATUS status;
    4545        const uint8_t *inbody;
    4646        int i = req->current_idx;
    47         size_t expected_body_size = 0x21;
    48         size_t body_size;
    4947        uint8_t in_file_info_class;
    5048        uint8_t in_flags;
     
    5250        uint64_t in_file_id_persistent;
    5351        uint64_t in_file_id_volatile;
     52        struct files_struct *in_fsp;
    5453        uint16_t in_file_name_offset;
    5554        uint16_t in_file_name_length;
     
    6160        bool ok;
    6261
    63         inhdr = (const uint8_t *)req->in.vector[i+0].iov_base;
    64         if (req->in.vector[i+1].iov_len != (expected_body_size & 0xFFFFFFFE)) {
    65                 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
    66         }
    67 
     62        status = smbd_smb2_request_verify_sizes(req, 0x21);
     63        if (!NT_STATUS_IS_OK(status)) {
     64                return smbd_smb2_request_error(req, status);
     65        }
    6866        inbody = (const uint8_t *)req->in.vector[i+1].iov_base;
    69 
    70         body_size = SVAL(inbody, 0x00);
    71         if (body_size != expected_body_size) {
    72                 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
    73         }
    7467
    7568        in_file_info_class              = CVAL(inbody, 0x02);
     
    8578                /* This is ok */
    8679        } else if (in_file_name_offset !=
    87                    (SMB2_HDR_BODY + (body_size & 0xFFFFFFFE))) {
     80                   (SMB2_HDR_BODY + req->in.vector[i+1].iov_len)) {
    8881                return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
    8982        }
     
    116109        }
    117110
    118         if (req->compat_chain_fsp) {
    119                 /* skip check */
    120         } else if (in_file_id_persistent != in_file_id_volatile) {
     111        if (in_file_name_buffer.length == 0) {
     112                in_file_name_string_size = 0;
     113        }
     114
     115        if (strlen(in_file_name_string) != in_file_name_string_size) {
     116                return smbd_smb2_request_error(req, NT_STATUS_OBJECT_NAME_INVALID);
     117        }
     118
     119        in_fsp = file_fsp_smb2(req, in_file_id_persistent, in_file_id_volatile);
     120        if (in_fsp == NULL) {
    121121                return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
    122122        }
    123123
    124         subreq = smbd_smb2_find_send(req,
    125                                      req->sconn->smb2.event_ctx,
    126                                      req,
     124        subreq = smbd_smb2_find_send(req, req->sconn->smb2.event_ctx,
     125                                     req, in_fsp,
    127126                                     in_file_info_class,
    128127                                     in_flags,
    129128                                     in_file_index,
    130                                      in_file_id_volatile,
    131129                                     in_output_buffer_length,
    132130                                     in_file_name_string);
     
    208206                                              struct tevent_context *ev,
    209207                                              struct smbd_smb2_request *smb2req,
     208                                              struct files_struct *fsp,
    210209                                              uint8_t in_file_info_class,
    211210                                              uint8_t in_flags,
    212211                                              uint32_t in_file_index,
    213                                               uint64_t in_file_id_volatile,
    214212                                              uint32_t in_output_buffer_length,
    215213                                              const char *in_file_name)
     
    219217        struct smb_request *smbreq;
    220218        connection_struct *conn = smb2req->tcon->compat_conn;
    221         files_struct *fsp;
    222219        NTSTATUS status;
    223220        NTSTATUS empty_status;
     
    242239        state->out_output_buffer = data_blob_null;
    243240
    244         DEBUG(10,("smbd_smb2_find_send: file_id[0x%016llX]\n",
    245                   (unsigned long long)in_file_id_volatile));
     241        DEBUG(10,("smbd_smb2_find_send: %s - fnum[%d]\n",
     242                  fsp_str_dbg(fsp), fsp->fnum));
    246243
    247244        smbreq = smbd_smb2_fake_smb_request(smb2req);
     
    250247        }
    251248
    252         fsp = file_fsp(smbreq, (uint16_t)in_file_id_volatile);
    253         if (fsp == NULL) {
    254                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    255                 return tevent_req_post(req, ev);
    256         }
    257         if (conn != fsp->conn) {
    258                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    259                 return tevent_req_post(req, ev);
    260         }
    261         if (smb2req->session->vuid != fsp->vuid) {
    262                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    263                 return tevent_req_post(req, ev);
    264         }
    265 
    266249        if (!fsp->is_directory) {
    267250                tevent_req_nterror(req, NT_STATUS_NOT_SUPPORTED);
     
    282265        }
    283266
    284         if (in_output_buffer_length > 0x10000) {
     267        if (in_output_buffer_length > smb2req->sconn->smb2.max_trans) {
    285268                tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
    286269                return tevent_req_post(req, ev);
Note: See TracChangeset for help on using the changeset viewer.