From 4089f7afa25492ade8af675c23fd7864f4a99e2b Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 27 Jul 2017 11:44:12 +1200 Subject: [PATCH 1/2] s4-rpc_server: ensure we get a new endpoint for netlogon If we share the single process RPC servers with the multi-process RPC servers on the same endpoint, they will default to running in an single process BUG: https://bugzilla.samba.org/show_bug.cgi?id=12939 Signed-off-by: Andrew Bartlett Reviewed-by: Douglas Bagnall (cherry picked from commit bc48c4b54b9c50d76fc967a1aa4fa013079605bc) --- source4/rpc_server/dcerpc_server.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c index de919e2..d6eebf7 100644 --- a/source4/rpc_server/dcerpc_server.c +++ b/source4/rpc_server/dcerpc_server.c @@ -354,8 +354,15 @@ _PUBLIC_ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, * If we have mulitiple endpoints on port 0, they each * get an epemeral port (currently by walking up from * 1024). + * + * Because one endpoint can only have one process + * model, we add a new IP_TCP endpoint for each model. + * + * This woks in conjunction with the forced overwrite + * of ep->use_single_process below. */ - if (!use_single_process && transport == NCACN_IP_TCP) { + if (ep->use_single_process != use_single_process + && transport == NCACN_IP_TCP) { add_ep = true; } } -- 1.9.1 From e1badd925184abd317e05dd051e11253ef5a9a84 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 27 Jul 2017 11:10:43 +1200 Subject: [PATCH 2/2] s4-rpc_server: Improve debug of new endpoints This helps us know what process model is required and what one is in use. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12939 Signed-off-by: Andrew Bartlett Reviewed-by: Douglas Bagnall Autobuild-User(master): Andrew Bartlett Autobuild-Date(master): Fri Jul 28 04:12:08 CEST 2017 on sn-devel-144 (cherry picked from commit 1ea6b5168f146d23d139b570084cb32ec02538fe) --- source4/rpc_server/dcerpc_server.c | 14 +++++++++++--- source4/rpc_server/service_rpc.c | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c index d6eebf7..1b6905a 100644 --- a/source4/rpc_server/dcerpc_server.c +++ b/source4/rpc_server/dcerpc_server.c @@ -275,7 +275,8 @@ _PUBLIC_ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, enum dcerpc_transport_t transport; char *ep_string = NULL; bool use_single_process = true; - + const char *ep_process_string; + /* * If we are not using handles, there is no need for force * this service into using a single process. @@ -444,8 +445,15 @@ _PUBLIC_ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, /* Re-get the string as we may have set a port */ ep_string = dcerpc_binding_string(dce_ctx, ep->ep_description); - DEBUG(4,("dcesrv_interface_register: interface '%s' registered on endpoint '%s'\n", - iface->name, ep_string)); + if (use_single_process) { + ep_process_string = "single process required"; + } else { + ep_process_string = "multi process compatible"; + } + + DBG_INFO("dcesrv_interface_register: interface '%s' " + "registered on endpoint '%s' (%s)\n", + iface->name, ep_string, ep_process_string); TALLOC_FREE(ep_string); return NT_STATUS_OK; diff --git a/source4/rpc_server/service_rpc.c b/source4/rpc_server/service_rpc.c index 44c0d53..3ff9f6f 100644 --- a/source4/rpc_server/service_rpc.c +++ b/source4/rpc_server/service_rpc.c @@ -81,6 +81,10 @@ static void dcesrv_task_init(struct task_server *task) enum dcerpc_transport_t transport = dcerpc_binding_get_transport(e->ep_description); + const char *transport_str + = derpc_transport_string_by_transport(transport); + + struct dcesrv_if_list *iface_list; /* * Ensure that -Msingle sets e->use_single_process for @@ -116,6 +120,18 @@ static void dcesrv_task_init(struct task_server *task) if (!NT_STATUS_IS_OK(status)) { goto failed; } + + DEBUG(5,("Added endpoint on %s " + "using process model %s for", + transport_str, + this_model_ops->name)); + + for (iface_list = e->interface_list; + iface_list != NULL; + iface_list = iface_list->next) { + DEBUGADD(5, (" %s", iface_list->iface.name)); + } + DEBUGADD(5, ("\n")); } irpc_add_name(task->msg_ctx, "rpc_server"); -- 1.9.1