Avoid calling pqsignal() with invalid signals on Windows frontends.
authorNathan Bossart <nathan@postgresql.org>
Thu, 16 Jan 2025 21:56:39 +0000 (15:56 -0600)
committerNathan Bossart <nathan@postgresql.org>
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;
 }