From 3b36a857980b1f9fa5a6be0253e85c975f35c13f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 11 Jul 2006 18:15:42 +0000 Subject: r16950: remove the smb mid from the ntvfs layer and keep a list of pending requests on the smbsrv_connection, to be able to match then on ntcancel metze (This used to be commit 04f0d3d03179b6060fd013b867d13caa92ec6460) --- source4/ntvfs/cifs/vfs_cifs.c | 2 +- source4/ntvfs/ntvfs.h | 3 --- source4/ntvfs/ntvfs_util.c | 3 +-- source4/ntvfs/posix/pvfs_wait.c | 3 +-- source4/rpc_server/srvsvc/dcesrv_srvsvc.c | 2 -- source4/rpc_server/srvsvc/srvsvc_ntvfs.c | 1 - source4/smb_server/smb/reply.c | 23 ++++++++++++++++++----- source4/smb_server/smb/request.c | 8 ++++++++ source4/smb_server/smb/service.c | 1 - source4/smb_server/smb2/smb2_server.h | 1 - source4/smb_server/smb2/tcon.c | 1 - source4/smb_server/smb_server.h | 29 ++++++++++++++++++----------- 12 files changed, 47 insertions(+), 30 deletions(-) diff --git a/source4/ntvfs/cifs/vfs_cifs.c b/source4/ntvfs/cifs/vfs_cifs.c index 47b89ff662..41ea2a652d 100644 --- a/source4/ntvfs/cifs/vfs_cifs.c +++ b/source4/ntvfs/cifs/vfs_cifs.c @@ -803,7 +803,7 @@ static NTSTATUS cvfs_cancel(struct ntvfs_module_context *ntvfs, /* find the matching request */ for (a=private->pending;a;a=a->next) { - if (a->req->smbmid == req->smbmid) { + if (a->req == req) { break; } } diff --git a/source4/ntvfs/ntvfs.h b/source4/ntvfs/ntvfs.h index cf541de81e..734df84dde 100644 --- a/source4/ntvfs/ntvfs.h +++ b/source4/ntvfs/ntvfs.h @@ -253,9 +253,6 @@ struct ntvfs_request { /* the smb pid is needed for locking contexts */ uint16_t smbpid; - /* the smb mid is needed for matching requests */ - uint16_t smbmid; - /* some statictics for the management tools */ struct { /* the system time when the request arrived */ diff --git a/source4/ntvfs/ntvfs_util.c b/source4/ntvfs/ntvfs_util.c index d99d040378..5c73b53c1c 100644 --- a/source4/ntvfs/ntvfs_util.c +++ b/source4/ntvfs/ntvfs_util.c @@ -28,7 +28,7 @@ _PUBLIC_ struct ntvfs_request *ntvfs_request_create(struct ntvfs_context *ctx, TALLOC_CTX *mem_ctx, struct auth_session_info *session_info, - uint16_t smbpid, uint16_t smbmid, + uint16_t smbpid, struct timeval request_time, void *private_data, void (*send_fn)(struct ntvfs_request *), @@ -43,7 +43,6 @@ _PUBLIC_ struct ntvfs_request *ntvfs_request_create(struct ntvfs_context *ctx, T req->async_states = NULL; req->session_info = session_info; req->smbpid = smbpid; - req->smbmid = smbmid; req->statistics.request_time = request_time; async = talloc(req, struct ntvfs_async_state); diff --git a/source4/ntvfs/posix/pvfs_wait.c b/source4/ntvfs/posix/pvfs_wait.c index 90c9b60efe..d912125289 100644 --- a/source4/ntvfs/posix/pvfs_wait.c +++ b/source4/ntvfs/posix/pvfs_wait.c @@ -179,8 +179,7 @@ NTSTATUS pvfs_cancel(struct ntvfs_module_context *ntvfs, struct ntvfs_request *r struct pvfs_wait *pwait; for (pwait=pvfs->wait_list;pwait;pwait=pwait->next) { - if (req->smbmid == pwait->req->smbmid && - req->smbpid == pwait->req->smbpid) { + if (pwait->req == req) { /* trigger a cancel on the request */ pwait->reason = PVFS_WAIT_CANCEL; ntvfs_async_setup(pwait->req, pwait); diff --git a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c index c1854a6b20..44296655ac 100644 --- a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c +++ b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c @@ -1417,7 +1417,6 @@ static WERROR srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALL ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx, dce_call->conn->auth_state.session_info, 0, - 0, dce_call->time, NULL, NULL, 0); W_ERROR_HAVE_NO_MEMORY(ntvfs_req); @@ -1459,7 +1458,6 @@ static WERROR srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALL ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx, dce_call->conn->auth_state.session_info, 0, - 0, dce_call->time, NULL, NULL, 0); W_ERROR_HAVE_NO_MEMORY(ntvfs_req); diff --git a/source4/rpc_server/srvsvc/srvsvc_ntvfs.c b/source4/rpc_server/srvsvc/srvsvc_ntvfs.c index 9fafb8a3cd..8bd88e53e9 100644 --- a/source4/rpc_server/srvsvc/srvsvc_ntvfs.c +++ b/source4/rpc_server/srvsvc/srvsvc_ntvfs.c @@ -113,7 +113,6 @@ NTSTATUS srvsvc_create_ntvfs_context(struct dcesrv_call_state *dce_call, ntvfs_req = ntvfs_request_create(c->ntvfs, mem_ctx, dce_call->conn->auth_state.session_info, 0, /* TODO: fill in PID */ - 0, /* TODO: fill in MID */ dce_call->time, NULL, NULL, 0); NT_STATUS_HAVE_NO_MEMORY(ntvfs_req); diff --git a/source4/smb_server/smb/reply.c b/source4/smb_server/smb/reply.c index 75830ae73a..c79ad15ea8 100644 --- a/source4/smb_server/smb/reply.c +++ b/source4/smb_server/smb/reply.c @@ -633,7 +633,6 @@ void smbsrv_reply_readbraw(struct smbsrv_request *req) req->ntvfs = ntvfs_request_create(req->tcon->ntvfs, req, req->session->session_info, SVAL(req->in.hdr,HDR_PID), - SVAL(req->in.hdr,HDR_MID), req->request_time, req, NULL, 0); if (!req->ntvfs) { @@ -2197,10 +2196,24 @@ void smbsrv_reply_ntcreate_and_X(struct smbsrv_request *req) ****************************************************************************/ void smbsrv_reply_ntcancel(struct smbsrv_request *req) { - /* NOTE: this request does not generate a reply */ - SMBSRV_SETUP_NTVFS_REQUEST(NULL,0); - ntvfs_cancel(req->ntvfs); - talloc_free(req); + struct smbsrv_request *r; + uint16_t mid = SVAL(req->in.hdr,HDR_MID); + uint16_t pid = SVAL(req->in.hdr,HDR_PID); + + for (r = req->smb_conn->requests; r; r = r->next) { + if (mid != SVAL(r->in.hdr,HDR_MID)) continue; + /* do we really need to check the PID? */ + if (pid != SVAL(r->in.hdr,HDR_PID)) continue; + + SMBSRV_CHECK(ntvfs_cancel(r->ntvfs)); + + /* NOTE: this request does not generate a reply */ + talloc_free(req); + return; + } + + /* TODO: workout the correct error code */ + smbsrv_send_error(req, NT_STATUS_FOOBAR); } /* diff --git a/source4/smb_server/smb/request.c b/source4/smb_server/smb/request.c index a08ae46852..fc7d060ea8 100644 --- a/source4/smb_server/smb/request.c +++ b/source4/smb_server/smb/request.c @@ -33,6 +33,12 @@ /* we over allocate the data buffer to prevent too many realloc calls */ #define REQ_OVER_ALLOCATION 0 +static int smbsrv_request_destructor(struct smbsrv_request *req) +{ + DLIST_REMOVE(req->smb_conn->requests, req); + return 0; +} + /**************************************************************************** construct a basic request packet, mostly used to construct async packets such as change notify and oplock break requests @@ -49,6 +55,8 @@ struct smbsrv_request *smbsrv_init_request(struct smbsrv_connection *smb_conn) /* setup the request context */ req->smb_conn = smb_conn; + talloc_set_destructor(req, smbsrv_request_destructor); + return req; } diff --git a/source4/smb_server/smb/service.c b/source4/smb_server/smb/service.c index 676f417619..92967d858c 100644 --- a/source4/smb_server/smb/service.c +++ b/source4/smb_server/smb/service.c @@ -89,7 +89,6 @@ static NTSTATUS make_connection_snum(struct smbsrv_request *req, req->ntvfs = ntvfs_request_create(req->tcon->ntvfs, req, req->session->session_info, SVAL(req->in.hdr,HDR_PID), - SVAL(req->in.hdr,HDR_MID), req->request_time, req, NULL, 0); if (!req->ntvfs) { diff --git a/source4/smb_server/smb2/smb2_server.h b/source4/smb_server/smb2/smb2_server.h index ce13756836..838abdf4d6 100644 --- a/source4/smb_server/smb2/smb2_server.h +++ b/source4/smb_server/smb2/smb2_server.h @@ -103,7 +103,6 @@ struct smbsrv_request; req->ntvfs = ntvfs_request_create(req->tcon->ntvfs, req, \ req->session->session_info,\ 0, \ - 0, \ req->request_time, \ req, send_fn, state); \ if (!req->ntvfs) { \ diff --git a/source4/smb_server/smb2/tcon.c b/source4/smb_server/smb2/tcon.c index cc0a911224..338fb5ed22 100644 --- a/source4/smb_server/smb2/tcon.c +++ b/source4/smb_server/smb2/tcon.c @@ -242,7 +242,6 @@ static NTSTATUS smb2srv_tcon_backend(struct smb2srv_request *req, union smb_tcon req->ntvfs = ntvfs_request_create(req->tcon->ntvfs, req, req->session->session_info, 0, /* TODO: fill in PID */ - 0, /* TODO: fill in MID */ req->request_time, req, NULL, 0); if (!req->ntvfs) { diff --git a/source4/smb_server/smb_server.h b/source4/smb_server/smb_server.h index 7ad1af2d27..c546de7e1c 100644 --- a/source4/smb_server/smb_server.h +++ b/source4/smb_server/smb_server.h @@ -24,6 +24,7 @@ #include "libcli/raw/interfaces.h" #include "lib/events/events.h" #include "lib/socket/socket.h" +#include "dlinklist.h" /* this header declares the core context structures associated with smb @@ -320,15 +321,11 @@ struct smbsrv_connection { /* context associated with currently valid session setups */ struct smbsrv_sessions_context sessions; - /* the server_context holds a linked list of pending requests, - * this is used for blocking locks and requests blocked due to oplock - * break requests */ - struct _smbsrv_pending_request { - struct _smbsrv_pending_request *next, *prev; - - /* the request itself - needs to be freed */ - struct smbsrv_request *request; - } *requests; + /* + * the server_context holds a linked list of pending requests, + * this is used for finding the request structures on ntcancel requests + */ + struct smbsrv_request *requests; struct smb_signing_context signing; @@ -387,7 +384,6 @@ struct smbsrv_connection { req->ntvfs = ntvfs_request_create(req->tcon->ntvfs, req, \ req->session->session_info,\ SVAL(req->in.hdr,HDR_PID), \ - SVAL(req->in.hdr,HDR_MID), \ req->request_time, \ req, send_fn, state); \ if (!req->ntvfs) { \ @@ -418,6 +414,15 @@ struct smbsrv_connection { } \ } while (0) +#define SMBSRV_CHECK(cmd) do {\ + NTSTATUS _status; \ + _status = cmd; \ + if (!NT_STATUS_IS_OK(_status)) { \ + smbsrv_send_error(req, _status); \ + return; \ + } \ +} while (0) + /* check if the backend wants to handle the request asynchronously. if it wants it handled synchronously then call the send function @@ -425,7 +430,9 @@ struct smbsrv_connection { */ #define SMBSRV_CALL_NTVFS_BACKEND(cmd) do { \ req->ntvfs->async_states->status = cmd; \ - if (!(req->ntvfs->async_states->state & NTVFS_ASYNC_STATE_ASYNC)) { \ + if (req->ntvfs->async_states->state & NTVFS_ASYNC_STATE_ASYNC) { \ + DLIST_ADD_END(req->smb_conn->requests, req, struct smbsrv_request *); \ + } else { \ req->ntvfs->async_states->send_fn(req->ntvfs); \ } \ } while (0) -- cgit