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_setinfo.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,
    3435                                                 DATA_BLOB in_input_buffer,
    35                                                  uint32_t in_additional_information,
    36                                                  uint64_t in_file_id_volatile);
     36                                                 uint32_t in_additional_information);
    3737static NTSTATUS smbd_smb2_setinfo_recv(struct tevent_req *req);
    3838
     
    4040NTSTATUS smbd_smb2_request_process_setinfo(struct smbd_smb2_request *req)
    4141{
    42         const uint8_t *inhdr;
     42        NTSTATUS status;
    4343        const uint8_t *inbody;
    4444        int i = req->current_idx;
    45         size_t expected_body_size = 0x21;
    46         size_t body_size;
    4745        uint8_t in_info_type;
    4846        uint8_t in_file_info_class;
     
    5351        uint64_t in_file_id_persistent;
    5452        uint64_t in_file_id_volatile;
     53        struct files_struct *in_fsp;
    5554        struct tevent_req *subreq;
    5655
    57         inhdr = (const uint8_t *)req->in.vector[i+0].iov_base;
    58         if (req->in.vector[i+1].iov_len != (expected_body_size & 0xFFFFFFFE)) {
    59                 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
    60         }
    61 
     56        status = smbd_smb2_request_verify_sizes(req, 0x21);
     57        if (!NT_STATUS_IS_OK(status)) {
     58                return smbd_smb2_request_error(req, status);
     59        }
    6260        inbody = (const uint8_t *)req->in.vector[i+1].iov_base;
    63 
    64         body_size = SVAL(inbody, 0x00);
    65         if (body_size != expected_body_size) {
    66                 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
    67         }
    6861
    6962        in_info_type                    = CVAL(inbody, 0x02);
     
    7972                /* This is ok */
    8073        } else if (in_input_buffer_offset !=
    81                    (SMB2_HDR_BODY + (body_size & 0xFFFFFFFE))) {
     74                   (SMB2_HDR_BODY + req->in.vector[i+1].iov_len)) {
    8275                return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
    8376        }
     
    9083        in_input_buffer.length = in_input_buffer_length;
    9184
    92         if (req->compat_chain_fsp) {
    93                 /* skip check */
    94         } else if (in_file_id_persistent != in_file_id_volatile) {
     85        if (in_input_buffer.length > req->sconn->smb2.max_trans) {
     86                return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
     87        }
     88
     89        in_fsp = file_fsp_smb2(req, in_file_id_persistent, in_file_id_volatile);
     90        if (in_fsp == NULL) {
    9591                return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
    9692        }
    9793
    98         subreq = smbd_smb2_setinfo_send(req,
    99                                         req->sconn->smb2.event_ctx,
    100                                         req,
     94        subreq = smbd_smb2_setinfo_send(req, req->sconn->smb2.event_ctx,
     95                                        req, in_fsp,
    10196                                        in_info_type,
    10297                                        in_file_info_class,
    10398                                        in_input_buffer,
    104                                         in_additional_information,
    105                                         in_file_id_volatile);
     99                                        in_additional_information);
    106100        if (subreq == NULL) {
    107101                return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY);
     
    160154                                                 struct tevent_context *ev,
    161155                                                 struct smbd_smb2_request *smb2req,
     156                                                 struct files_struct *fsp,
    162157                                                 uint8_t in_info_type,
    163158                                                 uint8_t in_file_info_class,
    164159                                                 DATA_BLOB in_input_buffer,
    165                                                  uint32_t in_additional_information,
    166                                                  uint64_t in_file_id_volatile)
     160                                                 uint32_t in_additional_information)
    167161{
    168162        struct tevent_req *req = NULL;
     
    170164        struct smb_request *smbreq = NULL;
    171165        connection_struct *conn = smb2req->tcon->compat_conn;
    172         files_struct *fsp = NULL;
    173166        NTSTATUS status;
    174167
     
    180173        state->smb2req = smb2req;
    181174
    182         DEBUG(10,("smbd_smb2_setinfo_send: file_id[0x%016llX]\n",
    183                   (unsigned long long)in_file_id_volatile));
     175        DEBUG(10,("smbd_smb2_setinfo_send: %s - fnum[%d]\n",
     176                  fsp_str_dbg(fsp), fsp->fnum));
    184177
    185178        smbreq = smbd_smb2_fake_smb_request(smb2req);
    186179        if (tevent_req_nomem(smbreq, req)) {
    187                 return tevent_req_post(req, ev);
    188         }
    189 
    190         fsp = file_fsp(smbreq, (uint16_t)in_file_id_volatile);
    191         if (fsp == NULL) {
    192                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    193                 return tevent_req_post(req, ev);
    194         }
    195         if (conn != fsp->conn) {
    196                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    197                 return tevent_req_post(req, ev);
    198         }
    199         if (smb2req->session->vuid != fsp->vuid) {
    200                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    201180                return tevent_req_post(req, ev);
    202181        }
     
    220199                        /* SMB2_FILE_RENAME_INFORMATION_INTERNAL == 0xFF00 + in_file_info_class */
    221200                        file_info_level = SMB2_FILE_RENAME_INFORMATION_INTERNAL;
    222                         if (fsp->oplock_type != FAKE_LEVEL_II_OPLOCK &&
    223                             fsp->oplock_type != NO_OPLOCK) {
    224                                 /* No break, but error. */
    225                                 tevent_req_nterror(req, NT_STATUS_SHARING_VIOLATION);
    226                                 return tevent_req_post(req, ev);
    227                         }
    228201                }
    229202
     
    326299                }
    327300
    328                 status = set_sd(fsp,
     301                status = set_sd_blob(fsp,
    329302                                in_input_buffer.data,
    330303                                in_input_buffer.length,
Note: See TracChangeset for help on using the changeset viewer.