]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: signal: register default handler for SIGINT in signal_init()
authorValentine Krasnobaeva <vkrasnobaeva@haproxy.com>
Mon, 2 Dec 2024 13:47:17 +0000 (14:47 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 2 Dec 2024 16:28:04 +0000 (17:28 +0100)
When haproxy is launched in a background and in a subshell (see example below),
according to POSIX standard (2.11. Signals and Error Handling), it inherits
from the subshell SIG_IGN signal handler for SIGINT and SIGQUIT.

$ (./haproxy -f env4.cfg &)

So, when haproxy is lanched like this, it doesn't stop upon receiving
the SIGINT. This can be a root cause of some unexpected timeouts, when haproxy
is started under VTest, as VTest sends to the process SIGINT in order to
terminate it. To fix this, let's explicitly register the default signal
handler for the SIGINT in signal_init() initcall.

This should be backported in all stable versions.

src/signal.c

index 1bb60eb82b6ccc8b9e6924073eae3f69d108e9d8..9dfb5dc4b51b57d227f07d6755559f171dea6764 100644 (file)
@@ -106,6 +106,13 @@ static void signal_init()
 {
        int sig;
 
+       /* Need to register the handler for SIGINT explicitly, as we can be
+        * laucned within the subshell and at background:
+        * $ (./haproxy -f env4.cfg &). According to POSIX standard
+        * (2.11. Signals and Error Handling), we will inherit from the subshell
+        * in this case SIG_IGN signal handler for SIGINT and SIGQUIT.
+        */
+       signal(SIGINT, SIG_DFL);
        signal_queue_len = 0;
        memset(signal_queue, 0, sizeof(signal_queue));
        memset(signal_state, 0, sizeof(signal_state));