From: Samuel Cabrero Date: Tue, 26 Feb 2019 15:58:10 +0000 (+0100) Subject: s3:rpc_server: Reinitialize dcesrv_context in external spoolssd daemon X-Git-Tag: ldb-2.2.0~1351 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f89ae36306cfb4dd0e205d27b6e2a4121d4761c8;p=thirdparty%2Fsamba.git s3:rpc_server: Reinitialize dcesrv_context in external spoolssd daemon Signed-off-by: Samuel Cabrero Reviewed-by: Andrew Bartlett --- diff --git a/source3/printing/queue_process.c b/source3/printing/queue_process.c index 0b6dc9fca9f..56f1b876e6b 100644 --- a/source3/printing/queue_process.c +++ b/source3/printing/queue_process.c @@ -432,6 +432,7 @@ pid_t start_background_queue(struct tevent_context *ev, /* Run before the parent forks */ bool printing_subsystem_init(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, + struct dcesrv_context *dce_ctx, bool start_daemons, bool background_queue) { @@ -445,7 +446,7 @@ bool printing_subsystem_init(struct tevent_context *ev_ctx, /* start as a separate daemon only if enabled */ if (start_daemons && rpc_spoolss_daemon() == RPC_DAEMON_FORK) { - pid = start_spoolssd(ev_ctx, msg_ctx); + pid = start_spoolssd(ev_ctx, msg_ctx, dce_ctx); } else if (start_daemons && background_queue) { diff --git a/source3/printing/queue_process.h b/source3/printing/queue_process.h index a325f13d329..e9d0195b3c4 100644 --- a/source3/printing/queue_process.h +++ b/source3/printing/queue_process.h @@ -23,8 +23,11 @@ #ifndef _SOURCE3_PRINTING_QUEUE_PROCESS_H_ #define _SOURCE3_PRINTING_QUEUE_PROCESS_H_ +struct dcesrv_context; + bool printing_subsystem_init(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, + struct dcesrv_context *dce_ctx, bool start_daemons, bool background_queue); void printing_subsystem_update(struct tevent_context *ev_ctx, diff --git a/source3/printing/spoolssd.c b/source3/printing/spoolssd.c index 1328cb43a85..5ebda1160ae 100644 --- a/source3/printing/spoolssd.c +++ b/source3/printing/spoolssd.c @@ -670,7 +670,8 @@ done: } pid_t start_spoolssd(struct tevent_context *ev_ctx, - struct messaging_context *msg_ctx) + struct messaging_context *msg_ctx, + struct dcesrv_context *dce_ctx) { struct rpc_srv_callbacks spoolss_cb; pid_t pid; @@ -765,6 +766,15 @@ pid_t start_spoolssd(struct tevent_context *ev_ctx, exit(1); } + DBG_INFO("Reinitializing DCE/RPC server context\n"); + + status = dcesrv_reinit_context(dce_ctx); + if (!NT_STATUS_IS_OK(status)) { + DBG_ERR("Failed to reinit DCE/RPC context: %s\n", + nt_errstr(status)); + exit(1); + } + /* the listening fd must be created before the children are actually * forked out. */ status = spoolssd_create_sockets(ev_ctx, msg_ctx, listen_fds, diff --git a/source3/printing/spoolssd.h b/source3/printing/spoolssd.h index e09fb5ea7bc..6d59b513cb9 100644 --- a/source3/printing/spoolssd.h +++ b/source3/printing/spoolssd.h @@ -23,7 +23,10 @@ #include "replace.h" #include "messages.h" +struct dcesrv_context; + pid_t start_spoolssd(struct tevent_context *ev_ctx, - struct messaging_context *msg_ctx); + struct messaging_context *msg_ctx, + struct dcesrv_context *dce_ctx); #endif /* _SOURCE3_PRINTING_SPOOLSSD_H_ */ diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 1822f538f55..3347519ea4f 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -2120,8 +2120,12 @@ extern void build_options(bool screen); if (!lp__disable_spoolss() && (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED)) { bool bgq = lp_parm_bool(-1, "smbd", "backgroundqueue", true); - - if (!printing_subsystem_init(ev_ctx, msg_ctx, true, bgq)) { + bool ok = printing_subsystem_init(ev_ctx, + msg_ctx, + dce_ctx, + true, + bgq); + if (!ok) { exit_daemon("Samba failed to init printing subsystem", EACCES); } } @@ -2134,7 +2138,12 @@ extern void build_options(bool screen); #endif } else if (!lp__disable_spoolss() && (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED)) { - if (!printing_subsystem_init(ev_ctx, msg_ctx, false, false)) { + bool ok = printing_subsystem_init(ev_ctx, + msg_ctx, + dce_ctx, + false, + false); + if (!ok) { exit(1); } }