Skip to content

Commit 42e538f

Browse files
committed
Fix pg_dump's sigTermHandler() to use _exit() not exit().
sigTermHandler() tried to be careful to invoke only operations that are safe to do in a signal handler. But for some reason we forgot that exit(3) is not among those, because it calls atexit handlers that might do various random things. (pg_dump itself installs no atexit handlers, but e.g. OpenSSL does.) That led to crashes or lockups when attempting to terminate a parallel dump or restore via a signal. Fix by calling _exit() instead. Per bug #16199 from Raúl Marín. Back-patch to all supported branches. Discussion: https://postgr.es/m/16199-cb2f121146a96f9b@postgresql.org
1 parent eb9d1f0 commit 42e538f

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

src/bin/pg_dump/parallel.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -574,8 +574,11 @@ sigTermHandler(SIGNAL_ARGS)
574574
write_stderr("terminated by user\n");
575575
}
576576

577-
/* And die. */
578-
exit(1);
577+
/*
578+
* And die, using _exit() not exit() because the latter will invoke atexit
579+
* handlers that can fail if we interrupted related code.
580+
*/
581+
_exit(1);
579582
}
580583

581584
/*

0 commit comments

Comments
 (0)