diff options
Diffstat (limited to 'source3/smbd/smb2_server.c')
-rw-r--r-- | source3/smbd/smb2_server.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c index edddccb9d9..9e5be404ef 100644 --- a/source3/smbd/smb2_server.c +++ b/source3/smbd/smb2_server.c @@ -420,10 +420,10 @@ struct smbd_smb2_request_pending_state { static void smbd_smb2_request_pending_writev_done(struct tevent_req *subreq); -NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req) +NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req, + struct tevent_req *subreq) { struct smbd_smb2_request_pending_state *state; - struct tevent_req *subreq; uint8_t *outhdr; int i = req->current_idx; uint32_t flags; @@ -432,6 +432,13 @@ NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req) uint8_t *hdr; uint8_t *body; + if (!tevent_req_is_in_progress(subreq)) { + return NT_STATUS_OK; + } + + req->subreq = subreq; + subreq = NULL; + outhdr = (uint8_t *)req->out.vector[i].iov_base; flags = IVAL(outhdr, SMB2_HDR_FLAGS); @@ -559,8 +566,8 @@ static NTSTATUS smbd_smb2_request_process_cancel(struct smbd_smb2_request *req) } } - if (cur) { - /* TODO: try to cancel the request */ + if (cur && cur->subreq) { + tevent_req_cancel(cur->subreq); } return NT_STATUS_OK; @@ -797,6 +804,8 @@ static NTSTATUS smbd_smb2_request_reply(struct smbd_smb2_request *req) { struct tevent_req *subreq; + req->subreq = NULL; + smb2_setup_nbt_length(req->out.vector, req->out.vector_count); if (req->do_signing) { |