- /* Make sure the signal is not delivered inside the
- * exec() */
- assert_se(sigemptyset(&mask) == 0);
- assert_se(sigaddset(&mask, sig) == 0);
- assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
+ /* Let the kernel reap children for us */
+ zero(sa);
+ sa.sa_handler = SIG_IGN;
+ sa.sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART;
+ assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
+
+ if ((pid = fork()) < 0)
+ log_error("Failed to fork off crash shell: %s", strerror(errno));
+ else if (pid == 0) {
+ execl("/bin/sh", "/bin/sh", NULL);