From: Samuel Cabrero Date: Thu, 19 Aug 2021 10:52:04 +0000 (+0200) Subject: librpc:core: Add a function to register an interface passing the binding handle X-Git-Tag: ldb-2.5.0~623 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c8521848bb5fedb3501d03e564a759d8709f418;p=thirdparty%2Fsamba.git librpc:core: Add a function to register an interface passing the binding handle Signed-off-by: Samuel Cabrero Reviewed-by: Volker Lendecke --- diff --git a/librpc/rpc/dcesrv_core.c b/librpc/rpc/dcesrv_core.c index b75336d0a85..6a2e0c25e7f 100644 --- a/librpc/rpc/dcesrv_core.c +++ b/librpc/rpc/dcesrv_core.c @@ -176,11 +176,47 @@ _PUBLIC_ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, const char *ncacn_np_secondary_endpoint, const struct dcesrv_interface *iface, const struct security_descriptor *sd) +{ + struct dcerpc_binding *binding = NULL; + struct dcerpc_binding *binding2 = NULL; + NTSTATUS ret; + + ret = dcerpc_parse_binding(dce_ctx, ep_name, &binding); + if (NT_STATUS_IS_ERR(ret)) { + DBG_ERR("Trouble parsing binding string '%s'\n", ep_name); + goto out; + } + + if (ncacn_np_secondary_endpoint != NULL) { + ret = dcerpc_parse_binding(dce_ctx, + ncacn_np_secondary_endpoint, + &binding2); + if (NT_STATUS_IS_ERR(ret)) { + DBG_ERR("Trouble parsing 2nd binding string '%s'\n", + ncacn_np_secondary_endpoint); + goto out; + } + } + + ret = dcesrv_interface_register_b(dce_ctx, + binding, + binding2, + iface, + sd); +out: + TALLOC_FREE(binding); + TALLOC_FREE(binding2); + return ret; +} + +_PUBLIC_ NTSTATUS dcesrv_interface_register_b(struct dcesrv_context *dce_ctx, + struct dcerpc_binding *binding, + struct dcerpc_binding *binding2, + const struct dcesrv_interface *iface, + const struct security_descriptor *sd) { struct dcesrv_endpoint *ep; struct dcesrv_if_list *ifl; - struct dcerpc_binding *binding; - struct dcerpc_binding *binding2 = NULL; bool add_ep = false; NTSTATUS status; enum dcerpc_transport_t transport; @@ -201,13 +237,6 @@ _PUBLIC_ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, use_single_process = false; } - status = dcerpc_parse_binding(dce_ctx, ep_name, &binding); - - if (NT_STATUS_IS_ERR(status)) { - DEBUG(0, ("Trouble parsing binding string '%s'\n", ep_name)); - return status; - } - transport = dcerpc_binding_get_transport(binding); if (transport == NCACN_IP_TCP) { int port; @@ -245,26 +274,19 @@ _PUBLIC_ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, } } - if (transport == NCACN_NP && ncacn_np_secondary_endpoint != NULL) { + if (transport == NCACN_NP && binding2 != NULL) { enum dcerpc_transport_t transport2; - status = dcerpc_parse_binding(dce_ctx, - ncacn_np_secondary_endpoint, - &binding2); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("Trouble parsing 2nd binding string '%s'\n", - ncacn_np_secondary_endpoint)); - return status; - } - transport2 = dcerpc_binding_get_transport(binding2); SMB_ASSERT(transport2 == transport); } /* see if the interface is already registered on the endpoint */ if (find_interface_by_binding(dce_ctx, binding, iface)!=NULL) { - DEBUG(0,("dcesrv_interface_register: interface '%s' already registered on endpoint '%s'\n", - iface->name, ep_name)); + char *binding_string = dcerpc_binding_string(dce_ctx, binding); + DBG_ERR("Interface '%s' already registered on endpoint '%s'\n", + iface->name, binding_string); + TALLOC_FREE(binding_string); return NT_STATUS_OBJECT_NAME_COLLISION; } @@ -299,8 +321,11 @@ _PUBLIC_ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, if (!ep) { return NT_STATUS_NO_MEMORY; } - ep->ep_description = talloc_move(ep, &binding); - ep->ep_2nd_description = talloc_move(ep, &binding2); + ep->ep_description = dcerpc_binding_dup(ep, binding); + if (transport == NCACN_NP && binding2 != NULL) { + ep->ep_2nd_description = + dcerpc_binding_dup(ep, binding2); + } add_ep = true; /* add mgmt interface */ @@ -367,9 +392,12 @@ _PUBLIC_ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, * or there was already one on the endpoint */ if (ep->sd != NULL) { - DEBUG(0,("dcesrv_interface_register: interface '%s' failed to setup a security descriptor\n" - " on endpoint '%s'\n", - iface->name, ep_name)); + char *binding_string = + dcerpc_binding_string(dce_ctx, binding); + DBG_ERR("Interface '%s' failed to setup a security " + "descriptor on endpoint '%s'\n", + iface->name, binding_string); + TALLOC_FREE(binding_string); if (add_ep) free(ep); free(ifl); return NT_STATUS_OBJECT_NAME_COLLISION; diff --git a/librpc/rpc/dcesrv_core.h b/librpc/rpc/dcesrv_core.h index d8d5f903095..e20bc00bbc1 100644 --- a/librpc/rpc/dcesrv_core.h +++ b/librpc/rpc/dcesrv_core.h @@ -462,6 +462,11 @@ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, const char *ncacn_np_secondary_endpoint, const struct dcesrv_interface *iface, const struct security_descriptor *sd); +NTSTATUS dcesrv_interface_register_b(struct dcesrv_context *dce_ctx, + struct dcerpc_binding *binding, + struct dcerpc_binding *binding2, + const struct dcesrv_interface *iface, + const struct security_descriptor *sd); NTSTATUS dcerpc_register_ep_server(const struct dcesrv_endpoint_server *ep_server); NTSTATUS dcesrv_init_ep_servers(struct dcesrv_context *dce_ctx, const char **ep_servers);