Skip to content

Commit

Permalink
librpc:core: Split dcesrv context init and endpoint servers init
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Andrew Bartlett <[email protected]>
  • Loading branch information
scabrero authored and abartlet committed Dec 12, 2019
1 parent fee5c6a commit 39dfc5c
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 13 deletions.
24 changes: 15 additions & 9 deletions librpc/rpc/dcesrv_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;

Expand All @@ -2370,7 +2377,6 @@ _PUBLIC_ NTSTATUS dcesrv_init_context(TALLOC_CTX *mem_ctx,
}
}

*_dce_ctx = dce_ctx;
return NT_STATUS_OK;
}

Expand Down
3 changes: 2 additions & 1 deletion librpc/rpc/dcesrv_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
8 changes: 7 additions & 1 deletion source4/rpc_server/service_rpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,20 +129,26 @@ 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);

task_server_set_title(task, "task[dcesrv]");

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);
Expand Down
8 changes: 6 additions & 2 deletions source4/torture/rpc/spoolss_notify.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 39dfc5c

Please sign in to comment.