Changeset 751 for trunk/server/source3/smbd/smb2_write.c
- Timestamp:
- Nov 29, 2012, 1:59:04 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server/source3/smbd/smb2_write.c
r745 r751 29 29 struct tevent_context *ev, 30 30 struct smbd_smb2_request *smb2req, 31 struct files_struct *in_fsp, 31 32 uint32_t in_smbpid, 32 uint64_t in_file_id_volatile,33 33 DATA_BLOB in_data, 34 34 uint64_t in_offset, … … 40 40 NTSTATUS smbd_smb2_request_process_write(struct smbd_smb2_request *req) 41 41 { 42 NTSTATUS status; 42 43 const uint8_t *inhdr; 43 44 const uint8_t *inbody; 44 45 int i = req->current_idx; 45 size_t expected_body_size = 0x31;46 size_t body_size;47 46 uint32_t in_smbpid; 48 47 uint16_t in_data_offset; … … 52 51 uint64_t in_file_id_persistent; 53 52 uint64_t in_file_id_volatile; 53 struct files_struct *in_fsp; 54 54 uint32_t in_flags; 55 55 struct tevent_req *subreq; 56 56 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 } 57 61 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 62 62 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 }68 63 69 64 in_smbpid = IVAL(inhdr, SMB2_HDR_PID); … … 76 71 in_flags = IVAL(inbody, 0x2C); 77 72 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)) { 79 74 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); 80 75 } … … 85 80 86 81 /* 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) { 89 83 DEBUG(2,("smbd_smb2_request_process_write : " 90 84 "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)); 93 86 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); 94 #endif95 87 } 96 88 … … 98 90 in_data_buffer.length = in_data_length; 99 91 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) { 103 94 return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED); 104 95 } 105 96 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, 109 99 in_smbpid, 110 in_file_id_volatile,111 100 in_data_buffer, 112 101 in_offset, … … 225 214 struct tevent_context *ev, 226 215 struct smbd_smb2_request *smb2req, 216 struct files_struct *fsp, 227 217 uint32_t in_smbpid, 228 uint64_t in_file_id_volatile,229 218 DATA_BLOB in_data, 230 219 uint64_t in_offset, … … 236 225 struct smb_request *smbreq = NULL; 237 226 connection_struct *conn = smb2req->tcon->compat_conn; 238 files_struct *fsp = NULL;239 227 ssize_t nwritten; 240 228 struct lock_struct lock; … … 252 240 state->out_count = 0; 253 241 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)); 256 244 257 245 smbreq = smbd_smb2_fake_smb_request(smb2req); 258 246 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);273 247 return tevent_req_post(req, ev); 274 248 } … … 325 299 if (!NT_STATUS_EQUAL(status, NT_STATUS_RETRY)) { 326 300 /* Real error in setting up aio. Fail. */ 327 tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);301 tevent_req_nterror(req, status); 328 302 return tevent_req_post(req, ev); 329 303 } … … 331 305 /* Fallback to synchronous. */ 332 306 init_strict_lock_struct(fsp, 333 in_file_id_volatile,307 fsp->fnum, 334 308 in_offset, 335 309 in_data.length,
Note:
See TracChangeset
for help on using the changeset viewer.