diff options
Diffstat (limited to 'source3/smbd/smb2_setinfo.c')
-rw-r--r-- | source3/smbd/smb2_setinfo.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/source3/smbd/smb2_setinfo.c b/source3/smbd/smb2_setinfo.c index d97caa44b6..d88f7ac8a2 100644 --- a/source3/smbd/smb2_setinfo.c +++ b/source3/smbd/smb2_setinfo.c @@ -41,7 +41,6 @@ NTSTATUS smbd_smb2_request_process_setinfo(struct smbd_smb2_request *req) { NTSTATUS status; const uint8_t *inbody; - int i = req->current_idx; uint8_t in_info_type; uint8_t in_file_info_class; uint16_t in_input_buffer_offset; @@ -57,7 +56,7 @@ NTSTATUS smbd_smb2_request_process_setinfo(struct smbd_smb2_request *req) if (!NT_STATUS_IS_OK(status)) { return smbd_smb2_request_error(req, status); } - inbody = (const uint8_t *)req->in.vector[i+1].iov_base; + inbody = SMBD_SMB2_IN_BODY_PTR(req); in_info_type = CVAL(inbody, 0x02); in_file_info_class = CVAL(inbody, 0x03); @@ -71,27 +70,37 @@ NTSTATUS smbd_smb2_request_process_setinfo(struct smbd_smb2_request *req) if (in_input_buffer_offset == 0 && in_input_buffer_length == 0) { /* This is ok */ } else if (in_input_buffer_offset != - (SMB2_HDR_BODY + req->in.vector[i+1].iov_len)) { + (SMB2_HDR_BODY + SMBD_SMB2_IN_BODY_LEN(req))) { return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); } - if (in_input_buffer_length > req->in.vector[i+2].iov_len) { + if (in_input_buffer_length > SMBD_SMB2_IN_DYN_LEN(req)) { return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); } - in_input_buffer.data = (uint8_t *)req->in.vector[i+2].iov_base; + in_input_buffer.data = SMBD_SMB2_IN_DYN_PTR(req); in_input_buffer.length = in_input_buffer_length; if (in_input_buffer.length > req->sconn->smb2.max_trans) { + DEBUG(2,("smbd_smb2_request_process_setinfo: " + "client ignored max trans: %s: 0x%08X: 0x%08X\n", + __location__, (unsigned)in_input_buffer.length, + (unsigned)req->sconn->smb2.max_trans)); return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); } + status = smbd_smb2_request_verify_creditcharge(req, + in_input_buffer.length); + if (!NT_STATUS_IS_OK(status)) { + return smbd_smb2_request_error(req, status); + } + in_fsp = file_fsp_smb2(req, in_file_id_persistent, in_file_id_volatile); if (in_fsp == NULL) { return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED); } - subreq = smbd_smb2_setinfo_send(req, req->sconn->smb2.event_ctx, + subreq = smbd_smb2_setinfo_send(req, req->sconn->ev_ctx, req, in_fsp, in_info_type, in_file_info_class, @@ -102,7 +111,7 @@ NTSTATUS smbd_smb2_request_process_setinfo(struct smbd_smb2_request *req) } tevent_req_set_callback(subreq, smbd_smb2_request_setinfo_done, req); - return smbd_smb2_request_pending_queue(req, subreq); + return smbd_smb2_request_pending_queue(req, subreq, 500); } static void smbd_smb2_request_setinfo_done(struct tevent_req *subreq) @@ -162,7 +171,7 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx, struct tevent_req *req = NULL; struct smbd_smb2_setinfo_state *state = NULL; struct smb_request *smbreq = NULL; - connection_struct *conn = smb2req->tcon->compat_conn; + connection_struct *conn = smb2req->tcon->compat; NTSTATUS status; req = tevent_req_create(mem_ctx, &state, @@ -172,8 +181,8 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx, } state->smb2req = smb2req; - DEBUG(10,("smbd_smb2_setinfo_send: %s - fnum[%d]\n", - fsp_str_dbg(fsp), fsp->fnum)); + DEBUG(10,("smbd_smb2_setinfo_send: %s - %s\n", + fsp_str_dbg(fsp), fsp_fnum_dbg(fsp))); smbreq = smbd_smb2_fake_smb_request(smb2req); if (tevent_req_nomem(smbreq, req)) { @@ -255,7 +264,8 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx, if (SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) != 0) { DEBUG(3,("smbd_smb2_setinfo_send: fstat " - "of fnum %d failed (%s)\n", fsp->fnum, + "of %s failed (%s)\n", + fsp_fnum_dbg(fsp), strerror(errno))); status = map_nt_error_from_unix(errno); tevent_req_nterror(req, status); |