]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:rpc_server: let get_servers() callback of rpc_worker_main() return NTSTATUS
authorStefan Metzmacher <metze@samba.org>
Wed, 9 Aug 2023 14:06:06 +0000 (16:06 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 17 Oct 2023 19:20:38 +0000 (19:20 +0000)
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 <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source3/rpc_server/rpc_worker.c
source3/rpc_server/rpc_worker.h
source3/rpc_server/rpcd_classic.c
source3/rpc_server/rpcd_epmapper.c
source3/rpc_server/rpcd_fsrvp.c
source3/rpc_server/rpcd_lsad.c
source3/rpc_server/rpcd_mdssvc.c
source3/rpc_server/rpcd_rpcecho.c
source3/rpc_server/rpcd_spoolss.c
source3/rpc_server/rpcd_winreg.c

index 64328466506ee6a60296575350c4ca2fb14b5d37..bbd337805ee9476228291d5a476dbafaa854d04e 100644 (file)
@@ -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);
 
index dd7d777a435cdba73aedfd2ec555af580ea97d23..54cc53fc89423406745a6cd3163ed366a48eed6e 100644 (file)
@@ -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);
 
index 8494af575ecbf6994980e88ffa6d6e501aba1a5e..484ea44122e22d2633e2743ba5fcacec23610687 100644 (file)
@@ -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[])
index 455179ccfba2f0a59b730f9d6aeee3a8873bcb4b..0d5f41a58fea2cd9f533babdbcd83f3a111e1096 100644 (file)
@@ -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[])
index 3325bbbc16b24d36806985579e778bc5623e86ee..f7db54436bf22da492fe547d6965a17ebec16dcf 100644 (file)
@@ -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[])
index b0e021493e7e834232a6ea49720db0e82ba89981..1fe7c681c7c491544c8ecd4ce0b6cb86e0b72405 100644 (file)
@@ -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[])
index 4040ae9e0d811ffe0a3c30c9b547a5ea9cdf2407..c872aa6bd83c8f9907bc4b9d3458c402eea2c2d9 100644 (file)
@@ -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[])
index 37391f563db8cd5f1fff11b7888b408a1fd3acbf..546666349c5323248fd77c67c447bece712ccf00 100644 (file)
@@ -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[])
index 16b4667cd02e78fa0157fcdf103b158d4688108f..43c7d5363d354faa832bfdb75325e05e1057cc5b 100644 (file)
@@ -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[])
index 4f92fd76617e22a7bbdda83f0bfeddbad47fd898..44715d89e72fa1c8cae8eb77174bcb135349b1e5 100644 (file)
@@ -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[])