]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: lib-signals - Fix creating non-automove signal handlers before ioloop
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 24 Jun 2020 07:30:21 +0000 (10:30 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 2 Jul 2020 08:24:55 +0000 (08:24 +0000)
src/lib/lib-signals.c

index 078fd005e3108965d59d60275dbb7bc5b414332a..3c239333992d4d37265f10002326ed3a8a95838b 100644 (file)
@@ -315,11 +315,22 @@ static void lib_signals_update_expected_signals(bool expected)
 
 static void lib_signals_enable_delayed_hander(void)
 {
-       if (current_ioloop != NULL && sig_pipe_fd[0] > 0) {
-               io_sig = io_add(sig_pipe_fd[0], IO_READ,
-                       signal_read, NULL);
-               io_set_never_wait_alone(io_sig, signals_expected == 0);
+       struct signal_handler *h;
+
+       if (current_ioloop == NULL || sig_pipe_fd[0] <= 0)
+               return;
+
+       /* initialize current_ioloop for signal handlers created before the
+          first ioloop. */
+       for (int signo = 0; signo < MAX_SIGNAL_VALUE; signo++) {
+               for (h = signal_handlers[signo]; h != NULL; h = h->next) {
+                       if (h->current_ioloop == NULL)
+                               h->current_ioloop = current_ioloop;
+               }
        }
+
+       io_sig = io_add(sig_pipe_fd[0], IO_READ, signal_read, NULL);
+       io_set_never_wait_alone(io_sig, signals_expected == 0);
 }
 
 static void lib_signals_disable_delayed_hander(void)