summaryrefslogtreecommitdiff
path: root/src/port/pqsignal.c
diff options
context:
space:
mode:
authorNathan Bossart <nathan@postgresql.org>2024-02-14 16:34:18 -0600
committerNathan Bossart <nathan@postgresql.org>2024-02-14 16:34:18 -0600
commit28e46325091dfac5c6ab9ea1e047a8d09dbd16e7 (patch)
treef48457af83f13b8bba8d600fe33aef1d39373e26 /src/port/pqsignal.c
parent3b00fdba9f20b641d5d3c2b781cd435b23540e61 (diff)
Centralize logic for restoring errno in signal handlers.
Presently, we rely on each individual signal handler to save the initial value of errno and then restore it before returning if needed. This is easily forgotten and, if missed, often goes undetected for a long time. In commit 3b00fdba9f, we introduced a wrapper signal handler function that checks whether MyProcPid matches getpid(). This commit moves the aforementioned errno restoration code from the individual signal handlers to the new wrapper handler so that we no longer need to worry about missing it. Reviewed-by: Andres Freund, Noah Misch Discussion: https://postgr.es/m/20231121212008.GA3742740%40nathanxps13
Diffstat (limited to 'src/port/pqsignal.c')
-rw-r--r--src/port/pqsignal.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/port/pqsignal.c b/src/port/pqsignal.c
index 92382b3c348..6ca2d4e20a8 100644
--- a/src/port/pqsignal.c
+++ b/src/port/pqsignal.c
@@ -80,10 +80,14 @@ static volatile pqsigfunc pqsignal_handlers[PG_NSIG];
* processes do not modify shared memory, which is often detrimental. If the
* check succeeds, the function originally provided to pqsignal() is called.
* Otherwise, the default signal handler is installed and then called.
+ *
+ * This wrapper also handles restoring the value of errno.
*/
static void
wrapper_handler(SIGNAL_ARGS)
{
+ int save_errno = errno;
+
#ifndef FRONTEND
/*
@@ -102,6 +106,8 @@ wrapper_handler(SIGNAL_ARGS)
#endif
(*pqsignal_handlers[postgres_signal_arg]) (postgres_signal_arg);
+
+ errno = save_errno;
}
/*