From ae38cfe6da728ea565d02e010d77360447b6007f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 9 Aug 2023 16:06:06 +0200 Subject: [PATCH] s3:rpc_server: let get_servers() callback of rpc_worker_main() return NTSTATUS This means the rpc_worker_main() logic is the only layer that needs to call exit() and its able to do some cleanup before. Signed-off-by: Stefan Metzmacher Reviewed-by: Andrew Bartlett --- source3/rpc_server/rpc_worker.c | 16 +++++++++++++--- source3/rpc_server/rpc_worker.h | 3 ++- source3/rpc_server/rpcd_classic.c | 6 ++++-- source3/rpc_server/rpcd_epmapper.c | 6 ++++-- source3/rpc_server/rpcd_fsrvp.c | 9 ++++++--- source3/rpc_server/rpcd_lsad.c | 6 ++++-- source3/rpc_server/rpcd_mdssvc.c | 8 +++++--- source3/rpc_server/rpcd_rpcecho.c | 6 ++++-- source3/rpc_server/rpcd_spoolss.c | 14 ++++++++------ source3/rpc_server/rpcd_winreg.c | 8 +++++--- 10 files changed, 55 insertions(+), 27 deletions(-) diff --git a/source3/rpc_server/rpc_worker.c b/source3/rpc_server/rpc_worker.c index 64328466506..bbd337805ee 100644 --- a/source3/rpc_server/rpc_worker.c +++ b/source3/rpc_server/rpc_worker.c @@ -955,7 +955,7 @@ static NTSTATUS register_ep_server( * * get_servers() is called when the process is about to do the real * work. So more heavy-weight initialization should happen here. It - * should return the number of server implementations provided. + * should return NT_STATUS_OK and the number of server implementations provided. * * @param[in] argc argc from main() * @param[in] argv argv from main() @@ -974,9 +974,10 @@ int rpc_worker_main( size_t (*get_interfaces)( const struct ndr_interface_table ***ifaces, void *private_data), - size_t (*get_servers)( + NTSTATUS (*get_servers)( struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server ***ep_servers, + size_t *num_ep_servers, void *private_data), void *private_data) { @@ -1185,7 +1186,16 @@ int rpc_worker_main( DBG_INFO("Initializing DCE/RPC registered endpoint servers\n"); - num_servers = get_servers(dce_ctx, &ep_servers, private_data); + status = get_servers(dce_ctx, + &ep_servers, + &num_servers, + private_data); + if (!NT_STATUS_IS_OK(status)) { + DBG_ERR("get_servers failed: %s\n", nt_errstr(status)); + global_messaging_context_free(); + TALLOC_FREE(frame); + exit(1); + } DBG_DEBUG("get_servers() returned %zu servers\n", num_servers); diff --git a/source3/rpc_server/rpc_worker.h b/source3/rpc_server/rpc_worker.h index dd7d777a435..54cc53fc894 100644 --- a/source3/rpc_server/rpc_worker.h +++ b/source3/rpc_server/rpc_worker.h @@ -30,9 +30,10 @@ int rpc_worker_main( size_t (*get_interfaces)( const struct ndr_interface_table ***ifaces, void *private_data), - size_t (*get_servers)( + NTSTATUS (*get_servers)( struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server ***ep_servers, + size_t *num_ep_servers, void *private_data), void *private_data); diff --git a/source3/rpc_server/rpcd_classic.c b/source3/rpc_server/rpcd_classic.c index 8494af575ec..484ea44122e 100644 --- a/source3/rpc_server/rpcd_classic.c +++ b/source3/rpc_server/rpcd_classic.c @@ -72,9 +72,10 @@ static size_t classic_interfaces( } -static size_t classic_servers( +static NTSTATUS classic_servers( struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server ***_ep_servers, + size_t *_num_ep_servers, void *private_data) { static const struct dcesrv_endpoint_server *ep_servers[7] = { NULL }; @@ -118,7 +119,8 @@ static size_t classic_servers( mangle_reset_cache(); *_ep_servers = ep_servers; - return num_servers; + *_num_ep_servers = num_servers; + return NT_STATUS_OK; } int main(int argc, const char *argv[]) diff --git a/source3/rpc_server/rpcd_epmapper.c b/source3/rpc_server/rpcd_epmapper.c index 455179ccfba..0d5f41a58fe 100644 --- a/source3/rpc_server/rpcd_epmapper.c +++ b/source3/rpc_server/rpcd_epmapper.c @@ -47,9 +47,10 @@ static size_t epmapper_interfaces( return num_ifaces; } -static size_t epmapper_servers( +static NTSTATUS epmapper_servers( struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server ***_ep_servers, + size_t *_num_ep_servers, void *private_data) { static const struct dcesrv_endpoint_server *ep_servers[] = { NULL }; @@ -70,7 +71,8 @@ static size_t epmapper_servers( } *_ep_servers = ep_servers; - return num_servers; + *_num_ep_servers = num_servers; + return NT_STATUS_OK; } int main(int argc, const char *argv[]) diff --git a/source3/rpc_server/rpcd_fsrvp.c b/source3/rpc_server/rpcd_fsrvp.c index 3325bbbc16b..f7db54436bf 100644 --- a/source3/rpc_server/rpcd_fsrvp.c +++ b/source3/rpc_server/rpcd_fsrvp.c @@ -45,16 +45,18 @@ static size_t fsrvp_interfaces( return ARRAY_SIZE(ifaces); } -static size_t fsrvp_servers( +static NTSTATUS fsrvp_servers( struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server ***_ep_servers, + size_t *_num_ep_servers, void *private_data) { static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL }; if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC) { *_ep_servers = NULL; - return 0; + *_num_ep_servers = 0; + return NT_STATUS_OK; } lp_load_with_shares(get_dyn_CONFIGFILE()); @@ -62,7 +64,8 @@ static size_t fsrvp_servers( ep_servers[0] = FileServerVssAgent_get_ep_server(); *_ep_servers = ep_servers; - return ARRAY_SIZE(ep_servers); + *_num_ep_servers = ARRAY_SIZE(ep_servers); + return NT_STATUS_OK; } int main(int argc, const char *argv[]) diff --git a/source3/rpc_server/rpcd_lsad.c b/source3/rpc_server/rpcd_lsad.c index b0e021493e7..1fe7c681c7c 100644 --- a/source3/rpc_server/rpcd_lsad.c +++ b/source3/rpc_server/rpcd_lsad.c @@ -67,9 +67,10 @@ static size_t lsad_interfaces( return num_ifaces; } -static size_t lsad_servers( +static NTSTATUS lsad_servers( struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server ***_ep_servers, + size_t *_num_ep_servers, void *private_data) { static const struct dcesrv_endpoint_server *ep_servers[4] = { NULL, }; @@ -106,7 +107,8 @@ static size_t lsad_servers( } *_ep_servers = ep_servers; - return num_servers; + *_num_ep_servers = num_servers; + return NT_STATUS_OK; } int main(int argc, const char *argv[]) diff --git a/source3/rpc_server/rpcd_mdssvc.c b/source3/rpc_server/rpcd_mdssvc.c index 4040ae9e0d8..c872aa6bd83 100644 --- a/source3/rpc_server/rpcd_mdssvc.c +++ b/source3/rpc_server/rpcd_mdssvc.c @@ -33,9 +33,10 @@ static size_t mdssvc_interfaces( return ARRAY_SIZE(ifaces); } -static size_t mdssvc_servers( +static NTSTATUS mdssvc_servers( struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server ***_ep_servers, + size_t *_num_ep_servers, void *private_data) { static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL }; @@ -46,13 +47,14 @@ static size_t mdssvc_servers( ok = posix_locking_init(false); if (!ok) { DBG_ERR("posix_locking_init() failed\n"); - exit(1); + return NT_STATUS_INTERNAL_ERROR; } ep_servers[0] = mdssvc_get_ep_server(); *_ep_servers = ep_servers; - return ARRAY_SIZE(ep_servers); + *_num_ep_servers = ARRAY_SIZE(ep_servers); + return NT_STATUS_OK; } int main(int argc, const char *argv[]) diff --git a/source3/rpc_server/rpcd_rpcecho.c b/source3/rpc_server/rpcd_rpcecho.c index 37391f563db..546666349c5 100644 --- a/source3/rpc_server/rpcd_rpcecho.c +++ b/source3/rpc_server/rpcd_rpcecho.c @@ -47,9 +47,10 @@ static size_t rpcecho_interfaces( return num_ifaces; } -static size_t rpcecho_servers( +static NTSTATUS rpcecho_servers( struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server ***_ep_servers, + size_t *_num_ep_servers, void *private_data) { static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL }; @@ -70,7 +71,8 @@ static size_t rpcecho_servers( } *_ep_servers = ep_servers; - return num_servers; + *_num_ep_servers = num_servers; + return NT_STATUS_OK; } int main(int argc, const char *argv[]) diff --git a/source3/rpc_server/rpcd_spoolss.c b/source3/rpc_server/rpcd_spoolss.c index 16b4667cd02..43c7d5363d3 100644 --- a/source3/rpc_server/rpcd_spoolss.c +++ b/source3/rpc_server/rpcd_spoolss.c @@ -37,9 +37,10 @@ static size_t spoolss_interfaces( return ARRAY_SIZE(ifaces); } -static size_t spoolss_servers( +static NTSTATUS spoolss_servers( struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server ***_ep_servers, + size_t *_num_ep_servers, void *private_data) { static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL }; @@ -52,27 +53,28 @@ static size_t spoolss_servers( ok = secrets_init(); if (!ok) { DBG_ERR("secrets_init() failed\n"); - exit(1); + return NT_STATUS_INTERNAL_ERROR; } ok = locking_init(); if (!ok) { DBG_ERR("locking_init() failed\n"); - exit(1); + return NT_STATUS_INTERNAL_ERROR; } lp_load_with_shares(get_dyn_CONFIGFILE()); ok = printing_subsystem_init(ev_ctx, msg_ctx, dce_ctx); if (!ok) { - DBG_WARNING("printing_subsystem_init() failed\n"); - exit(1); + DBG_ERR("printing_subsystem_init() failed\n"); + return NT_STATUS_INTERNAL_ERROR; } mangle_reset_cache(); *_ep_servers = ep_servers; - return ARRAY_SIZE(ep_servers); + *_num_ep_servers = ARRAY_SIZE(ep_servers); + return NT_STATUS_OK; } int main(int argc, const char *argv[]) diff --git a/source3/rpc_server/rpcd_winreg.c b/source3/rpc_server/rpcd_winreg.c index 4f92fd76617..44715d89e72 100644 --- a/source3/rpc_server/rpcd_winreg.c +++ b/source3/rpc_server/rpcd_winreg.c @@ -32,9 +32,10 @@ static size_t winreg_interfaces( return ARRAY_SIZE(ifaces); } -static size_t winreg_servers( +static NTSTATUS winreg_servers( struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server ***_ep_servers, + size_t *_num_ep_servers, void *private_data) { static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL }; @@ -46,13 +47,14 @@ static size_t winreg_servers( if (!W_ERROR_IS_OK(werr)) { DBG_ERR("registry_init_full() failed: %s\n", win_errstr(werr)); - exit(1); + return werror_to_ntstatus(werr); } lp_load_with_shares(get_dyn_CONFIGFILE()); *_ep_servers = ep_servers; - return ARRAY_SIZE(ep_servers); + *_num_ep_servers = ARRAY_SIZE(ep_servers); + return NT_STATUS_OK; } int main(int argc, const char *argv[])