postgres.git / summary / log / commit / refs
commit 5cda4fdb0beb64453b634d0ab966912965c7b8f6
Author: Nathan Bossart <nathan@postgresql.org>
Date: Thu Jan 16 21:56:39 2025 +0000
First released in: 18.0
Avoid calling pqsignal() with invalid signals on Windows frontends.
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 | 19 +++++--------------
src/bin/pg_test_fsync/pg_test_fsync.c | 5 ++---
src/test/regress/pg_regress.c | 8 ++++++--
3 files changed, 13 insertions(+), 19 deletions(-)
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 101c780012b..ea4b66b3bf5 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -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
}
diff --git a/src/bin/pg_test_fsync/pg_test_fsync.c b/src/bin/pg_test_fsync/pg_test_fsync.c
index 5a2aabef26b..0060ea15902 100644
--- a/src/bin/pg_test_fsync/pg_test_fsync.c
+++ b/src/bin/pg_test_fsync/pg_test_fsync.c
@@ -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
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index cbef6d48d31..61a234ae218 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -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;
}
[parent: d7674c9fab09]