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

    r745 r751  
    2929                                               struct tevent_context *ev,
    3030                                               struct smbd_smb2_request *smb2req,
     31                                               struct files_struct *in_fsp,
    3132                                               uint32_t in_smbpid,
    32                                                uint64_t in_file_id_volatile,
    3333                                               DATA_BLOB in_data,
    3434                                               uint64_t in_offset,
     
    4040NTSTATUS smbd_smb2_request_process_write(struct smbd_smb2_request *req)
    4141{
     42        NTSTATUS status;
    4243        const uint8_t *inhdr;
    4344        const uint8_t *inbody;
    4445        int i = req->current_idx;
    45         size_t expected_body_size = 0x31;
    46         size_t body_size;
    4746        uint32_t in_smbpid;
    4847        uint16_t in_data_offset;
     
    5251        uint64_t in_file_id_persistent;
    5352        uint64_t in_file_id_volatile;
     53        struct files_struct *in_fsp;
    5454        uint32_t in_flags;
    5555        struct tevent_req *subreq;
    5656
     57        status = smbd_smb2_request_verify_sizes(req, 0x31);
     58        if (!NT_STATUS_IS_OK(status)) {
     59                return smbd_smb2_request_error(req, status);
     60        }
    5761        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 
    6262        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         }
    6863
    6964        in_smbpid = IVAL(inhdr, SMB2_HDR_PID);
     
    7671        in_flags                = IVAL(inbody, 0x2C);
    7772
    78         if (in_data_offset != (SMB2_HDR_BODY + (body_size & 0xFFFFFFFE))) {
     73        if (in_data_offset != (SMB2_HDR_BODY + req->in.vector[i+1].iov_len)) {
    7974                return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
    8075        }
     
    8580
    8681        /* check the max write size */
    87         if (in_data_length > lp_smb2_max_write()) {
    88                 /* This is a warning. */
     82        if (in_data_length > req->sconn->smb2.max_write) {
    8983                DEBUG(2,("smbd_smb2_request_process_write : "
    9084                        "client ignored max write :%s: 0x%08X: 0x%08X\n",
    91                         __location__, in_data_length, lp_smb2_max_write()));
    92 #if 0
     85                        __location__, in_data_length, req->sconn->smb2.max_write));
    9386                return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
    94 #endif
    9587        }
    9688
     
    9890        in_data_buffer.length = in_data_length;
    9991
    100         if (req->compat_chain_fsp) {
    101                 /* skip check */
    102         } else if (in_file_id_persistent != in_file_id_volatile) {
     92        in_fsp = file_fsp_smb2(req, in_file_id_persistent, in_file_id_volatile);
     93        if (in_fsp == NULL) {
    10394                return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
    10495        }
    10596
    106         subreq = smbd_smb2_write_send(req,
    107                                       req->sconn->smb2.event_ctx,
    108                                       req,
     97        subreq = smbd_smb2_write_send(req, req->sconn->smb2.event_ctx,
     98                                      req, in_fsp,
    10999                                      in_smbpid,
    110                                       in_file_id_volatile,
    111100                                      in_data_buffer,
    112101                                      in_offset,
     
    225214                                               struct tevent_context *ev,
    226215                                               struct smbd_smb2_request *smb2req,
     216                                               struct files_struct *fsp,
    227217                                               uint32_t in_smbpid,
    228                                                uint64_t in_file_id_volatile,
    229218                                               DATA_BLOB in_data,
    230219                                               uint64_t in_offset,
     
    236225        struct smb_request *smbreq = NULL;
    237226        connection_struct *conn = smb2req->tcon->compat_conn;
    238         files_struct *fsp = NULL;
    239227        ssize_t nwritten;
    240228        struct lock_struct lock;
     
    252240        state->out_count = 0;
    253241
    254         DEBUG(10,("smbd_smb2_write: file_id[0x%016llX]\n",
    255                   (unsigned long long)in_file_id_volatile));
     242        DEBUG(10,("smbd_smb2_write: %s - fnum[%d]\n",
     243                  fsp_str_dbg(fsp), fsp->fnum));
    256244
    257245        smbreq = smbd_smb2_fake_smb_request(smb2req);
    258246        if (tevent_req_nomem(smbreq, req)) {
    259                 return tevent_req_post(req, ev);
    260         }
    261 
    262         fsp = file_fsp(smbreq, (uint16_t)in_file_id_volatile);
    263         if (fsp == NULL) {
    264                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    265                 return tevent_req_post(req, ev);
    266         }
    267         if (conn != fsp->conn) {
    268                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    269                 return tevent_req_post(req, ev);
    270         }
    271         if (smb2req->session->vuid != fsp->vuid) {
    272                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
    273247                return tevent_req_post(req, ev);
    274248        }
     
    325299        if (!NT_STATUS_EQUAL(status, NT_STATUS_RETRY)) {
    326300                /* Real error in setting up aio. Fail. */
    327                 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
     301                tevent_req_nterror(req, status);
    328302                return tevent_req_post(req, ev);
    329303        }
     
    331305        /* Fallback to synchronous. */
    332306        init_strict_lock_struct(fsp,
    333                                 in_file_id_volatile,
     307                                fsp->fnum,
    334308                                in_offset,
    335309                                in_data.length,
Note: See TracChangeset for help on using the changeset viewer.