Avoid calling pqsignal() with invalid signals on Windows frontends.
authorNathan Bossart <[email protected]>
Thu, 16 Jan 2025 21:56:39 +0000 (15:56 -0600)
committerNathan Bossart <[email protected]>
Thu, 16 Jan 2025 21:56:39 +0000 (15:56 -0600)
As noted by the comment at the top of port/pqsignal.c, Windows
frontend programs can only use pqsignal() with the 6 signals
required by C.  Most places avoid using invalid signals via #ifndef
WIN32, but initdb and pg_test_fsync check whether the signal itself
is defined, which doesn't work because win32_port.h defines many
extra signals for the signal emulation code.  pg_regress seems to
have missed the memo completely.  These issues aren't causing any
real problems today because nobody checks the return value of
pqsignal(), but a follow-up commit will add some error checking.

To fix, surround all frontend calls to pqsignal() that use signals
that are invalid on Windows with #ifndef WIN32.  We cannot simply
skip defining the extra signals in win32_port.h for frontends
because they are needed in places such as pgkill().

Reviewed-by: Thomas Munro
Discussion: https://postgr.es/m/Z4chOKfnthRH71mw%40nathan

src/bin/initdb/initdb.c
src/bin/pg_test_fsync/pg_test_fsync.c
src/test/regress/pg_regress.c

index 101c780012b26bee711a77fad4b992c31d0c2f16..ea4b66b3bf556531afc2a129f9faa0c17e358835 100644 (file)
@@ -2874,27 +2874,18 @@ setup_text_search(void)
 void
 setup_signals(void)
 {
-       /* some of these are not valid on Windows */
-#ifdef SIGHUP
-       pqsignal(SIGHUP, trapsig);
-#endif
-#ifdef SIGINT
        pqsignal(SIGINT, trapsig);
-#endif
-#ifdef SIGQUIT
-       pqsignal(SIGQUIT, trapsig);
-#endif
-#ifdef SIGTERM
        pqsignal(SIGTERM, trapsig);
-#endif
+
+       /* the following are not valid on Windows */
+#ifndef WIN32
+       pqsignal(SIGHUP, trapsig);
+       pqsignal(SIGQUIT, trapsig);
 
        /* Ignore SIGPIPE when writing to backend, so we can clean up */
-#ifdef SIGPIPE
        pqsignal(SIGPIPE, SIG_IGN);
-#endif
 
        /* Prevent SIGSYS so we can probe for kernel calls that might not work */
-#ifdef SIGSYS
        pqsignal(SIGSYS, SIG_IGN);
 #endif
 }
index 5a2aabef26b09334f7eb8ca0551c2bbf0f9110df..0060ea15902cbd1999e14ac63decf2274164afae 100644 (file)
@@ -112,11 +112,10 @@ main(int argc, char *argv[])
        /* Prevent leaving behind the test file */
        pqsignal(SIGINT, signal_cleanup);
        pqsignal(SIGTERM, signal_cleanup);
+
+       /* the following are not valid on Windows */
 #ifndef WIN32
        pqsignal(SIGALRM, process_alarm);
-#endif
-#ifdef SIGHUP
-       /* Not defined on win32 */
        pqsignal(SIGHUP, signal_cleanup);
 #endif
 
index cbef6d48d3148e1982b7652960953bc1571329d1..61a234ae218104c30d4a0007cd94678014e49ac3 100644 (file)
@@ -518,11 +518,15 @@ make_temp_sockdir(void)
         * Remove the directory before dying to the usual signals.  Omit SIGQUIT,
         * preserving it as a quick, untidy exit.
         */
-       pqsignal(SIGHUP, signal_remove_temp);
        pqsignal(SIGINT, signal_remove_temp);
-       pqsignal(SIGPIPE, signal_remove_temp);
        pqsignal(SIGTERM, signal_remove_temp);
 
+       /* the following are not valid on Windows */
+#ifndef WIN32
+       pqsignal(SIGHUP, signal_remove_temp);
+       pqsignal(SIGPIPE, signal_remove_temp);
+#endif
+
        return temp_sockdir;
 }