summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Cabrero <scabrero@suse.de>2019-02-05 18:54:02 +0100
committerAndrew Bartlett <abartlet@samba.org>2019-12-12 00:35:30 +0000
commit39dfc5c82b2345f2eee7d14f6f2cc3ee8b2aef3d (patch)
tree8e4e63eabf3872025d92e4b9796c8d172e2de1ee
parentfee5c6a4247aeac71318186bbff7708d25de5912 (diff)
downloadsamba-39dfc5c82b2345f2eee7d14f6f2cc3ee8b2aef3d.tar.gz
librpc:core: Split dcesrv context init and endpoint servers init
The S4 server will initialize the endpoint servers specified in smb.conf, but the S3 server need to initialize all registered endpoint servers (the embedded ones). Signed-off-by: Samuel Cabrero <scabrero@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
-rw-r--r--librpc/rpc/dcesrv_core.c24
-rw-r--r--librpc/rpc/dcesrv_core.h3
-rw-r--r--source4/rpc_server/service_rpc.c8
-rw-r--r--source4/torture/rpc/spoolss_notify.c8
4 files changed, 30 insertions, 13 deletions
diff --git a/librpc/rpc/dcesrv_core.c b/librpc/rpc/dcesrv_core.c
index daa95afcab7..5e548a288d0 100644
--- a/librpc/rpc/dcesrv_core.c
+++ b/librpc/rpc/dcesrv_core.c
@@ -2320,18 +2320,10 @@ static NTSTATUS dcesrv_process_ncacn_packet(struct dcesrv_connection *dce_conn,
_PUBLIC_ NTSTATUS dcesrv_init_context(TALLOC_CTX *mem_ctx,
struct loadparm_context *lp_ctx,
- const char **endpoint_servers,
struct dcesrv_context_callbacks *cb,
struct dcesrv_context **_dce_ctx)
{
- NTSTATUS status;
struct dcesrv_context *dce_ctx;
- int i;
-
- if (!endpoint_servers) {
- DEBUG(0,("dcesrv_init_context: no endpoint servers configured\n"));
- return NT_STATUS_INTERNAL_ERROR;
- }
dce_ctx = talloc_zero(mem_ctx, struct dcesrv_context);
NT_STATUS_HAVE_NO_MEMORY(dce_ctx);
@@ -2353,6 +2345,21 @@ _PUBLIC_ NTSTATUS dcesrv_init_context(TALLOC_CTX *mem_ctx,
dce_ctx->callbacks = *cb;
}
+ *_dce_ctx = dce_ctx;
+ return NT_STATUS_OK;
+}
+
+_PUBLIC_ NTSTATUS dcesrv_init_ep_servers(struct dcesrv_context *dce_ctx,
+ const char **endpoint_servers)
+{
+ NTSTATUS status;
+ int i;
+
+ if (endpoint_servers == NULL) {
+ DBG_ERR("No endpoint servers configured\n");
+ return NT_STATUS_INTERNAL_ERROR;
+ }
+
for (i=0;endpoint_servers[i];i++) {
const struct dcesrv_endpoint_server *ep_server;
@@ -2370,7 +2377,6 @@ _PUBLIC_ NTSTATUS dcesrv_init_context(TALLOC_CTX *mem_ctx,
}
}
- *_dce_ctx = dce_ctx;
return NT_STATUS_OK;
}
diff --git a/librpc/rpc/dcesrv_core.h b/librpc/rpc/dcesrv_core.h
index 5e47976ced9..e5ad652a4e2 100644
--- a/librpc/rpc/dcesrv_core.h
+++ b/librpc/rpc/dcesrv_core.h
@@ -444,11 +444,12 @@ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx,
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);
const struct dcesrv_endpoint_server *dcesrv_ep_server_byname(const char *name);
NTSTATUS dcesrv_init_context(TALLOC_CTX *mem_ctx,
struct loadparm_context *lp_ctx,
- const char **endpoint_servers,
struct dcesrv_context_callbacks *cb,
struct dcesrv_context **_dce_ctx);
diff --git a/source4/rpc_server/service_rpc.c b/source4/rpc_server/service_rpc.c
index ef4bfab237a..96ebc2dbe57 100644
--- a/source4/rpc_server/service_rpc.c
+++ b/source4/rpc_server/service_rpc.c
@@ -129,6 +129,7 @@ static NTSTATUS dcesrv_task_init(struct task_server *task)
{
NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
struct dcesrv_context *dce_ctx;
+ const char **ep_servers = NULL;
dcerpc_server_init(task->lp_ctx);
@@ -136,13 +137,18 @@ static NTSTATUS dcesrv_task_init(struct task_server *task)
status = dcesrv_init_context(task->event_ctx,
task->lp_ctx,
- lpcfg_dcerpc_endpoint_servers(task->lp_ctx),
&srv_callbacks,
&dce_ctx);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
+ ep_servers = lpcfg_dcerpc_endpoint_servers(task->lp_ctx);
+ status = dcesrv_init_ep_servers(dce_ctx, ep_servers);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
/* Make sure the directory for NCALRPC exists */
if (!directory_exist(lpcfg_ncalrpc_dir(task->lp_ctx))) {
mkdir(lpcfg_ncalrpc_dir(task->lp_ctx), 0755);
diff --git a/source4/torture/rpc/spoolss_notify.c b/source4/torture/rpc/spoolss_notify.c
index fa2b917c8d9..9b183ac49ae 100644
--- a/source4/torture/rpc/spoolss_notify.c
+++ b/source4/torture/rpc/spoolss_notify.c
@@ -483,11 +483,15 @@ static bool test_start_dcerpc_server(struct torture_context *tctx,
address, NULL);
torture_assert_ntstatus_ok(tctx, status, "starting smb server");
- status = dcesrv_init_context(tctx, tctx->lp_ctx, endpoints,
- &srv_cb, &dce_ctx);
+ status = dcesrv_init_context(tctx, tctx->lp_ctx, &srv_cb, &dce_ctx);
torture_assert_ntstatus_ok(tctx, status,
"unable to initialize DCE/RPC server");
+ status = dcesrv_init_ep_servers(dce_ctx, endpoints);
+ torture_assert_ntstatus_ok(tctx,
+ status,
+ "unable to initialize DCE/RPC ep servers");
+
for (e=dce_ctx->endpoint_list;e;e=e->next) {
status = dcesrv_add_ep(dce_ctx, tctx->lp_ctx,
e, tctx->ev,