Changeset 751 for trunk/server/source3/smbd/smb2_find.c
- Timestamp:
- Nov 29, 2012, 1:59:04 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server/source3/smbd/smb2_find.c
r745 r751 29 29 struct tevent_context *ev, 30 30 struct smbd_smb2_request *smb2req, 31 struct files_struct *in_fsp, 31 32 uint8_t in_file_info_class, 32 33 uint8_t in_flags, 33 34 uint32_t in_file_index, 34 uint64_t in_file_id_volatile,35 35 uint32_t in_output_buffer_length, 36 36 const char *in_file_name); … … 42 42 NTSTATUS smbd_smb2_request_process_find(struct smbd_smb2_request *req) 43 43 { 44 const uint8_t *inhdr;44 NTSTATUS status; 45 45 const uint8_t *inbody; 46 46 int i = req->current_idx; 47 size_t expected_body_size = 0x21;48 size_t body_size;49 47 uint8_t in_file_info_class; 50 48 uint8_t in_flags; … … 52 50 uint64_t in_file_id_persistent; 53 51 uint64_t in_file_id_volatile; 52 struct files_struct *in_fsp; 54 53 uint16_t in_file_name_offset; 55 54 uint16_t in_file_name_length; … … 61 60 bool ok; 62 61 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 } 68 66 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 }74 67 75 68 in_file_info_class = CVAL(inbody, 0x02); … … 85 78 /* This is ok */ 86 79 } else if (in_file_name_offset != 87 (SMB2_HDR_BODY + (body_size & 0xFFFFFFFE))) {80 (SMB2_HDR_BODY + req->in.vector[i+1].iov_len)) { 88 81 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); 89 82 } … … 116 109 } 117 110 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) { 121 121 return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED); 122 122 } 123 123 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, 127 126 in_file_info_class, 128 127 in_flags, 129 128 in_file_index, 130 in_file_id_volatile,131 129 in_output_buffer_length, 132 130 in_file_name_string); … … 208 206 struct tevent_context *ev, 209 207 struct smbd_smb2_request *smb2req, 208 struct files_struct *fsp, 210 209 uint8_t in_file_info_class, 211 210 uint8_t in_flags, 212 211 uint32_t in_file_index, 213 uint64_t in_file_id_volatile,214 212 uint32_t in_output_buffer_length, 215 213 const char *in_file_name) … … 219 217 struct smb_request *smbreq; 220 218 connection_struct *conn = smb2req->tcon->compat_conn; 221 files_struct *fsp;222 219 NTSTATUS status; 223 220 NTSTATUS empty_status; … … 242 239 state->out_output_buffer = data_blob_null; 243 240 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)); 246 243 247 244 smbreq = smbd_smb2_fake_smb_request(smb2req); … … 250 247 } 251 248 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 266 249 if (!fsp->is_directory) { 267 250 tevent_req_nterror(req, NT_STATUS_NOT_SUPPORTED); … … 282 265 } 283 266 284 if (in_output_buffer_length > 0x10000) {267 if (in_output_buffer_length > smb2req->sconn->smb2.max_trans) { 285 268 tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); 286 269 return tevent_req_post(req, ev);
Note:
See TracChangeset
for help on using the changeset viewer.