From e4e86e4308d20fb0d87ef6590332945c0959f736 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 9 Mar 2011 10:17:06 +0100 Subject: [PATCH] s3-librpc: Leave the epm registration connection open. (cherry picked from commit 81a2046879299a051e69fd4d78b3a8e49b690f1b) --- source3/librpc/rpc/dcerpc_ep.c | 50 ++++++++++++++++++++++++++++++++------- source3/librpc/rpc/dcerpc_ep.h | 18 ++++++++++---- source3/rpc_server/rpc_ep_setup.c | 32 +++++++++++++++++-------- 3 files changed, 77 insertions(+), 23 deletions(-) diff --git a/source3/librpc/rpc/dcerpc_ep.c b/source3/librpc/rpc/dcerpc_ep.c index 764dc17233a..92c01a32bbc 100644 --- a/source3/librpc/rpc/dcerpc_ep.c +++ b/source3/librpc/rpc/dcerpc_ep.c @@ -130,12 +130,14 @@ done: return status; } -static NTSTATUS ep_register(const struct ndr_interface_table *iface, +static NTSTATUS ep_register(TALLOC_CTX *mem_ctx, + const struct ndr_interface_table *iface, const struct dcerpc_binding_vector *bind_vec, const struct GUID *object_guid, const char *annotation, uint32_t replace, - uint32_t unregister) + uint32_t unregister, + struct dcerpc_binding_handle **pbh) { struct rpc_pipe_client *cli = NULL; struct dcerpc_binding_handle *h; @@ -285,33 +287,63 @@ static NTSTATUS ep_register(const struct ndr_interface_table *iface, goto done; } + if (pbh != NULL) { + *pbh = talloc_move(mem_ctx, &h); + talloc_steal(mem_ctx, cli); + } + done: talloc_free(tmp_ctx); return status; } -NTSTATUS dcerpc_ep_register(const struct ndr_interface_table *iface, +NTSTATUS dcerpc_ep_register(TALLOC_CTX *mem_ctx, + const struct ndr_interface_table *iface, const struct dcerpc_binding_vector *bind_vec, const struct GUID *object_guid, - const char *annotation) + const char *annotation, + struct dcerpc_binding_handle **ph) { - return ep_register(iface, bind_vec, object_guid, annotation, 1, 0); + return ep_register(mem_ctx, + iface, + bind_vec, + object_guid, + annotation, + 1, + 0, + ph); } -NTSTATUS dcerpc_ep_register_noreplace(const struct ndr_interface_table *iface, +NTSTATUS dcerpc_ep_register_noreplace(TALLOC_CTX *mem_ctx, + const struct ndr_interface_table *iface, const struct dcerpc_binding_vector *bind_vec, const struct GUID *object_guid, - const char *annotation) + const char *annotation, + struct dcerpc_binding_handle **ph) { - return ep_register(iface, bind_vec, object_guid, annotation, 0, 0); + return ep_register(mem_ctx, + iface, + bind_vec, + object_guid, + annotation, + 0, + 0, + ph); } NTSTATUS dcerpc_ep_unregister(const struct ndr_interface_table *iface, const struct dcerpc_binding_vector *bind_vec, const struct GUID *object_guid) { - return ep_register(iface, bind_vec, object_guid, NULL, 0, 1); + return ep_register(NULL, + iface, + bind_vec, + object_guid, + NULL, + 0, + 1, + NULL); } /* vim: set ts=8 sw=8 noet cindent syntax=c.doxygen: */ diff --git a/source3/librpc/rpc/dcerpc_ep.h b/source3/librpc/rpc/dcerpc_ep.h index 99682beb9a3..57b1d274408 100644 --- a/source3/librpc/rpc/dcerpc_ep.h +++ b/source3/librpc/rpc/dcerpc_ep.h @@ -34,6 +34,8 @@ NTSTATUS dcerpc_binding_vector_create(TALLOC_CTX *mem_ctx, /** * @brief Adds server address information in the local endpoint map. * + * @param[in] mem_ctx The memory context to use for the binding handle. + * * @param[in] iface The interface specification to register with the local * endpoint map. * @@ -55,17 +57,25 @@ NTSTATUS dcerpc_binding_vector_create(TALLOC_CTX *mem_ctx, * supplied, including an empty annotation string, * replaces any existing annotation string. * + * @param[out] ph A pointer to store the binding handle. The memory + * context will be the give one. If you free this handle + * then the connection will be closed. + * * @return An NTSTATUS error code. */ -NTSTATUS dcerpc_ep_register(const struct ndr_interface_table *iface, +NTSTATUS dcerpc_ep_register(TALLOC_CTX *mem_ctx, + const struct ndr_interface_table *iface, const struct dcerpc_binding_vector *bind_vec, const struct GUID *object_guid, - const char *annotation); + const char *annotation, + struct dcerpc_binding_handle **ph); -NTSTATUS dcerpc_ep_register_noreplace(const struct ndr_interface_table *iface, +NTSTATUS dcerpc_ep_register_noreplace(TALLOC_CTX *mem_ctx, + const struct ndr_interface_table *iface, const struct dcerpc_binding_vector *bind_vec, const struct GUID *object_guid, - const char *annotation); + const char *annotation, + struct dcerpc_binding_handle **ph); NTSTATUS dcerpc_ep_unregister(const struct ndr_interface_table *iface, const struct dcerpc_binding_vector *bind_vec, diff --git a/source3/rpc_server/rpc_ep_setup.c b/source3/rpc_server/rpc_ep_setup.c index 19eba17ef58..6ffcf10b9b6 100644 --- a/source3/rpc_server/rpc_ep_setup.c +++ b/source3/rpc_server/rpc_ep_setup.c @@ -149,14 +149,16 @@ static NTSTATUS _rpc_ep_unregister(const struct ndr_interface_table *iface) } static void rpc_ep_setup_register_loop(struct tevent_req *subreq); -static NTSTATUS rpc_ep_setup_try_register(struct tevent_context *ev_ctx, +static NTSTATUS rpc_ep_setup_try_register(TALLOC_CTX *mem_ctx, + struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, const struct ndr_interface_table *iface, const char *name, - uint16_t port); + uint16_t port, + struct dcerpc_binding_handle **pbh); struct rpc_ep_regsiter_state { - uint32_t wait_time; + struct dcerpc_binding_handle *h; struct tevent_context *ev_ctx; struct messaging_context *msg_ctx; @@ -165,6 +167,8 @@ struct rpc_ep_regsiter_state { const char *ncalrpc; uint16_t port; + + uint32_t wait_time; }; static NTSTATUS rpc_ep_setup_register(struct tevent_context *ev_ctx, @@ -209,14 +213,17 @@ static void rpc_ep_setup_register_loop(struct tevent_req *req) ok = tevent_wakeup_recv(req); TALLOC_FREE(req); if (!ok) { + talloc_free(state); return; } - status = rpc_ep_setup_try_register(state->ev_ctx, + status = rpc_ep_setup_try_register(state, + state->ev_ctx, state->msg_ctx, state->iface, state->ncalrpc, - state->port); + state->port, + &state->h); if (NT_STATUS_IS_OK(status)) { talloc_free(state); return; @@ -240,16 +247,18 @@ static void rpc_ep_setup_register_loop(struct tevent_req *req) return; } -static NTSTATUS rpc_ep_setup_try_register(struct tevent_context *ev_ctx, +static NTSTATUS rpc_ep_setup_try_register(TALLOC_CTX *mem_ctx, + struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, const struct ndr_interface_table *iface, const char *name, - uint16_t port) + uint16_t port, + struct dcerpc_binding_handle **pbh) { struct dcerpc_binding_vector *v = NULL; NTSTATUS status; - status = dcerpc_binding_vector_create(talloc_tos(), + status = dcerpc_binding_vector_create(mem_ctx, iface, port, name, @@ -258,10 +267,13 @@ static NTSTATUS rpc_ep_setup_try_register(struct tevent_context *ev_ctx, return status; } - status = dcerpc_ep_register(iface, + status = dcerpc_ep_register(mem_ctx, + iface, v, &iface->syntax_id.uuid, - name); + name, + pbh); + talloc_free(v); if (!NT_STATUS_IS_OK(status)) { return status; } -- 2.11.4.GIT