Module Name: xsrc
Committed By: mlelstv
Date: Fri Oct 20 10:18:56 UTC 2023
Modified Files:
xsrc/external/mit/ctwm/dist: signals.c
Log Message:
Use a SIGCHLD handler instead of ignoring the signal.
This avoids lockups when child processes were inherited (e.g. from .xsession)
but new children are waited for in system().
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1 -r1.2 xsrc/external/mit/ctwm/dist/signals.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: xsrc/external/mit/ctwm/dist/signals.c
diff -u xsrc/external/mit/ctwm/dist/signals.c:1.1.1.1 xsrc/external/mit/ctwm/dist/signals.c:1.2
--- xsrc/external/mit/ctwm/dist/signals.c:1.1.1.1 Wed Jul 5 07:36:07 2023
+++ xsrc/external/mit/ctwm/dist/signals.c Fri Oct 20 10:18:55 2023
@@ -8,6 +8,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+#include <errno.h>
+#include <sys/wait.h>
#include "ctwm_shutdown.h"
#include "signals.h"
@@ -26,6 +28,15 @@ static bool sig_shutdown = false;
// needs to trigger an action.
bool SignalFlag = false;
+void ChildExit(int signum)
+{
+ int Errno = errno;
+ /* reap dead children, ignore status */
+ while (waitpid(-1, NULL, WNOHANG) > 0)
+ continue;
+ /* restore errno for interrupted sys calls */
+ errno = Errno;
+}
/**
* Setup signal handlers (run during startup)
@@ -46,9 +57,12 @@ setup_signal_handlers(void)
// die...
signal(SIGALRM, SIG_IGN);
- // This should be set by default, but just in case; explicitly don't
- // leave zombies.
- signal(SIGCHLD, SIG_IGN);
+ /* Setting SIGCHLD to SIG_IGN detaches children from the parent
+ * immediately, so it need not be waited for.
+ * In fact, you cannot wait for it, so a function like system()
+ * breaks.
+ */
+ signal(SIGCHLD, ChildExit);
return;
}