Changeset 751 for trunk/server/source3/smbd/smb2_getinfo.c
- Timestamp:
- Nov 29, 2012, 1:59:04 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server/source3/smbd/smb2_getinfo.c
r745 r751 30 30 struct tevent_context *ev, 31 31 struct smbd_smb2_request *smb2req, 32 struct files_struct *in_fsp, 32 33 uint8_t in_info_type, 33 34 uint8_t in_file_info_class, … … 35 36 DATA_BLOB in_input_buffer, 36 37 uint32_t in_additional_information, 37 uint32_t in_flags, 38 uint64_t in_file_id_volatile); 38 uint32_t in_flags); 39 39 static NTSTATUS smbd_smb2_getinfo_recv(struct tevent_req *req, 40 40 TALLOC_CTX *mem_ctx, … … 45 45 NTSTATUS smbd_smb2_request_process_getinfo(struct smbd_smb2_request *req) 46 46 { 47 const uint8_t *inhdr;47 NTSTATUS status; 48 48 const uint8_t *inbody; 49 49 int i = req->current_idx; 50 size_t expected_body_size = 0x29;51 size_t body_size;52 50 uint8_t in_info_type; 53 51 uint8_t in_file_info_class; … … 60 58 uint64_t in_file_id_persistent; 61 59 uint64_t in_file_id_volatile; 60 struct files_struct *in_fsp; 62 61 struct tevent_req *subreq; 63 62 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 } 69 67 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 }75 68 76 69 in_info_type = CVAL(inbody, 0x02); … … 88 81 /* This is ok */ 89 82 } else if (in_input_buffer_offset != 90 (SMB2_HDR_BODY + (body_size & 0xFFFFFFFE))) {83 (SMB2_HDR_BODY + req->in.vector[i+1].iov_len)) { 91 84 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); 92 85 } … … 99 92 in_input_buffer.length = in_input_buffer_length; 100 93 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) { 104 103 return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED); 105 104 } 106 105 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, 110 108 in_info_type, 111 109 in_file_info_class, … … 113 111 in_input_buffer, 114 112 in_additional_information, 115 in_flags, 116 in_file_id_volatile); 113 in_flags); 117 114 if (subreq == NULL) { 118 115 return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY); … … 236 233 struct tevent_context *ev, 237 234 struct smbd_smb2_request *smb2req, 235 struct files_struct *fsp, 238 236 uint8_t in_info_type, 239 237 uint8_t in_file_info_class, … … 241 239 DATA_BLOB in_input_buffer, 242 240 uint32_t in_additional_information, 243 uint32_t in_flags, 244 uint64_t in_file_id_volatile) 241 uint32_t in_flags) 245 242 { 246 243 struct tevent_req *req; … … 248 245 struct smb_request *smbreq; 249 246 connection_struct *conn = smb2req->tcon->compat_conn; 250 files_struct *fsp;251 247 NTSTATUS status; 252 248 … … 260 256 state->out_output_buffer = data_blob_null; 261 257 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)); 264 260 265 261 smbreq = smbd_smb2_fake_smb_request(smb2req); 266 262 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);281 263 return tevent_req_post(req, ev); 282 264 }
Note:
See TracChangeset
for help on using the changeset viewer.