librpc:core: Add a function to register an interface passing the binding handle
authorSamuel Cabrero <scabrero@suse.de>
Thu, 19 Aug 2021 10:52:04 +0000 (12:52 +0200)
committerVolker Lendecke <vl@samba.org>
Tue, 21 Sep 2021 10:15:34 +0000 (10:15 +0000)
Signed-off-by: Samuel Cabrero <scabrero@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
librpc/rpc/dcesrv_core.c
librpc/rpc/dcesrv_core.h

index b75336d0a8540ff5230451a210375075e4445350..6a2e0c25e7fd4788649e69ad2215e3f3dd69a148 100644 (file)
@@ -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;
index d8d5f9030959973fe35c8aa50847f8aaab24d7eb..e20bc00bbc1bdd1103102c5c371d2a8901fecad4 100644 (file)
@@ -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);