CVE-2023-42670 s3-rpc_server: Strictly refuse to start RPC servers in conflict with...
[metze/samba/wip.git] / source3 / rpc_server / rpcd_classic.c
index 4f6164c814cd699d7d34da609e2f453f0a1a4979..8494af575ecbf6994980e88ffa6d6e501aba1a5e 100644 (file)
@@ -42,14 +42,34 @@ static size_t classic_interfaces(
        static const struct ndr_interface_table *ifaces[] = {
                &ndr_table_srvsvc,
                &ndr_table_netdfs,
-               &ndr_table_wkssvc,
+               &ndr_table_initshutdown,
                &ndr_table_svcctl,
                &ndr_table_ntsvcs,
                &ndr_table_eventlog,
-               &ndr_table_initshutdown,
+               /*
+                * This last item is truncated from the list by the
+                * num_ifaces -= 1 below.  Take care when adding new
+                * services.
+                */
+               &ndr_table_wkssvc,
        };
+       size_t num_ifaces = ARRAY_SIZE(ifaces);
+
+       switch(lp_server_role()) {
+       case ROLE_ACTIVE_DIRECTORY_DC:
+               /*
+                * On the AD DC wkssvc is provided by the 'samba'
+                * binary from source4/
+                */
+               num_ifaces -= 1;
+               break;
+       default:
+               break;
+       }
+
        *pifaces = ifaces;
-       return ARRAY_SIZE(ifaces);
+       return num_ifaces;
+
 }
 
 static size_t classic_servers(
@@ -58,15 +78,28 @@ static size_t classic_servers(
        void *private_data)
 {
        static const struct dcesrv_endpoint_server *ep_servers[7] = { NULL };
+       size_t num_servers = ARRAY_SIZE(ep_servers);
        bool ok;
 
        ep_servers[0] = srvsvc_get_ep_server();
        ep_servers[1] = netdfs_get_ep_server();
-       ep_servers[2] = wkssvc_get_ep_server();
+       ep_servers[2] = initshutdown_get_ep_server();
        ep_servers[3] = svcctl_get_ep_server();
        ep_servers[4] = ntsvcs_get_ep_server();
        ep_servers[5] = eventlog_get_ep_server();
-       ep_servers[6] = initshutdown_get_ep_server();
+       ep_servers[6] = wkssvc_get_ep_server();
+
+       switch(lp_server_role()) {
+       case ROLE_ACTIVE_DIRECTORY_DC:
+               /*
+                * On the AD DC wkssvc is provided by the 'samba'
+                * binary from source4/
+                */
+               num_servers -= 1;
+               break;
+       default:
+               break;
+       }
 
        ok = secrets_init();
        if (!ok) {
@@ -85,7 +118,7 @@ static size_t classic_servers(
        mangle_reset_cache();
 
        *_ep_servers = ep_servers;
-       return ARRAY_SIZE(ep_servers);
+       return num_servers;
 }
 
 int main(int argc, const char *argv[])