From: Timo Sirainen Date: Thu, 6 Sep 2018 16:48:09 +0000 (+0300) Subject: master: Start service processes only after adding all service listeners X-Git-Tag: 2.3.9~1415 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d9365fa88dc15c38764da87d062cf926c42d7631;p=thirdparty%2Fdovecot%2Fcore.git master: Start service processes only after adding all service listeners 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. --- diff --git a/src/master/service-monitor.c b/src/master/service-monitor.c index a1d9795dbf..9ff8959f25 100644 --- a/src/master/service-monitor.c +++ b/src/master/service-monitor.c @@ -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);