Changeset 751 for trunk/server/source3/smbd/smb2_setinfo.c
- Timestamp:
- Nov 29, 2012, 1:59:04 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server/source3/smbd/smb2_setinfo.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, 34 35 DATA_BLOB in_input_buffer, 35 uint32_t in_additional_information, 36 uint64_t in_file_id_volatile); 36 uint32_t in_additional_information); 37 37 static NTSTATUS smbd_smb2_setinfo_recv(struct tevent_req *req); 38 38 … … 40 40 NTSTATUS smbd_smb2_request_process_setinfo(struct smbd_smb2_request *req) 41 41 { 42 const uint8_t *inhdr;42 NTSTATUS status; 43 43 const uint8_t *inbody; 44 44 int i = req->current_idx; 45 size_t expected_body_size = 0x21;46 size_t body_size;47 45 uint8_t in_info_type; 48 46 uint8_t in_file_info_class; … … 53 51 uint64_t in_file_id_persistent; 54 52 uint64_t in_file_id_volatile; 53 struct files_struct *in_fsp; 55 54 struct tevent_req *subreq; 56 55 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 } 62 60 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 61 69 62 in_info_type = CVAL(inbody, 0x02); … … 79 72 /* This is ok */ 80 73 } else if (in_input_buffer_offset != 81 (SMB2_HDR_BODY + (body_size & 0xFFFFFFFE))) {74 (SMB2_HDR_BODY + req->in.vector[i+1].iov_len)) { 82 75 return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); 83 76 } … … 90 83 in_input_buffer.length = in_input_buffer_length; 91 84 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) { 95 91 return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED); 96 92 } 97 93 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, 101 96 in_info_type, 102 97 in_file_info_class, 103 98 in_input_buffer, 104 in_additional_information, 105 in_file_id_volatile); 99 in_additional_information); 106 100 if (subreq == NULL) { 107 101 return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY); … … 160 154 struct tevent_context *ev, 161 155 struct smbd_smb2_request *smb2req, 156 struct files_struct *fsp, 162 157 uint8_t in_info_type, 163 158 uint8_t in_file_info_class, 164 159 DATA_BLOB in_input_buffer, 165 uint32_t in_additional_information, 166 uint64_t in_file_id_volatile) 160 uint32_t in_additional_information) 167 161 { 168 162 struct tevent_req *req = NULL; … … 170 164 struct smb_request *smbreq = NULL; 171 165 connection_struct *conn = smb2req->tcon->compat_conn; 172 files_struct *fsp = NULL;173 166 NTSTATUS status; 174 167 … … 180 173 state->smb2req = smb2req; 181 174 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)); 184 177 185 178 smbreq = smbd_smb2_fake_smb_request(smb2req); 186 179 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);201 180 return tevent_req_post(req, ev); 202 181 } … … 220 199 /* SMB2_FILE_RENAME_INFORMATION_INTERNAL == 0xFF00 + in_file_info_class */ 221 200 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 }228 201 } 229 202 … … 326 299 } 327 300 328 status = set_sd (fsp,301 status = set_sd_blob(fsp, 329 302 in_input_buffer.data, 330 303 in_input_buffer.length,
Note:
See TracChangeset
for help on using the changeset viewer.