]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
master: Start service processes only after adding all service listeners
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 6 Sep 2018 16:48:09 +0000 (19:48 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Wed, 14 Nov 2018 08:10:46 +0000 (10:10 +0200)
Otherwise the processes could try to connect to services that aren't being
listened on, causing errors. Especially stats-writer socket needs to be
available early on.

src/master/service-monitor.c

index 998ee7068fa8df2cf22ce1e64e6a9e645f6c0031..2fed3f11c4c846dd82060bd2e9415c40d037407f 100644 (file)
@@ -441,6 +441,7 @@ static int service_login_create_notify_fd(struct service *service)
 
 void services_monitor_start(struct service_list *service_list)
 {
+       ARRAY(struct service *) listener_services;
        struct service *const *services;
 
        if (services_log_init(service_list) < 0)
@@ -454,6 +455,7 @@ void services_monitor_start(struct service_list *service_list)
                               master_client_connected, service_list);
        }
 
+       t_array_init(&listener_services, array_count(&service_list->services));
        array_foreach(&service_list->services, services) {
                struct service *service = *services;
 
@@ -486,10 +488,14 @@ void services_monitor_start(struct service_list *service_list)
                                io_add(service->status_fd[0], IO_READ,
                                       service_status_input, service);
                }
-               service_monitor_start_extra_avail(service);
                service_monitor_listen_start(service);
+               array_append(&listener_services, &service, 1);
        }
 
+       /* create processes only after adding all listeners */
+       array_foreach(&listener_services, services)
+               service_monitor_start_extra_avail(*services);
+
        if (service_list->log->status_fd[0] != -1) {
                if (service_process_create(service_list->log) != NULL)
                        service_monitor_listen_stop(service_list->log);