QProcess/Unix: reset the signal block if ResetSignalHandlers requested

This amends commit f9c87cfd44 to reset the
signal block mask too, not just the signal handlers. For this, SIGPIPE
is not treated specially.

Pick-to: 6.6
Change-Id: Ib5ce7a497e034ebabb2cfffd17627289614bf315
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Thiago Macieira 2023-05-25 10:19:04 -07:00
parent 78cdd9a64d
commit 062b2ac71b
3 changed files with 33 additions and 6 deletions

View File

@ -613,6 +613,11 @@ static void applyProcessParameters(const QProcess::UnixProcessParameters &params
if (!ignore_sigpipe || sig != SIGPIPE)
signal(sig, SIG_DFL);
}
// and unmask all signals
sigset_t set;
sigemptyset(&set);
sigprocmask(SIG_SETMASK, &set, nullptr);
}
// Close all file descriptors above stderr.

View File

@ -30,17 +30,30 @@ int main(int argc, char **argv)
}
if (cmd == "reset-sighand") {
// confirm it was not ignored
bool ok = true;
// confirm our signal block mask is empty
sigset_t set;
sigprocmask(SIG_SETMASK, nullptr, &set);
for (int signo = 1; signo < NSIG; ++signo) {
if (sigismember(&set, signo)) {
fprintf(stderr, "'%s' is blocked.\n", strsignal(signo));
ok = false;
}
}
// confirm SIGUSR1 was not ignored
struct sigaction action;
sigaction(SIGUSR1, nullptr, &action);
if (action.sa_handler == SIG_DFL)
return EXIT_SUCCESS;
fprintf(stderr, "SIGUSR1 is SIG_IGN\n");
return EXIT_FAILURE;
if (action.sa_handler != SIG_DFL) {
fprintf(stderr, "SIGUSR1 is SIG_IGN\n");
ok = false;
}
return ok ? EXIT_SUCCESS : EXIT_FAILURE;
}
if (cmd == "ignore-sigpipe") {
// confirm it was ignored
// confirm SIGPIPE was ignored
struct sigaction action;
sigaction(SIGPIPE, nullptr, &action);
if (action.sa_handler == SIG_IGN)

View File

@ -1562,6 +1562,11 @@ void tst_QProcess::unixProcessParameters()
sigaction(SIGUSR1, &act, &old_sigusr1);
act.sa_handler = SIG_DFL;
sigaction(SIGPIPE, &act, &old_sigpipe);
// and we block SIGUSR2
sigset_t *set = &act.sa_mask; // reuse this sigset_t
sigaddset(set, SIGUSR2);
sigprocmask(SIG_BLOCK, set, nullptr);
}
~Scope()
{
@ -1574,6 +1579,10 @@ void tst_QProcess::unixProcessParameters()
sigaction(SIGUSR1, &old_sigusr1, nullptr);
sigaction(SIGPIPE, &old_sigpipe, nullptr);
devnull = -1;
sigset_t *set = &old_sigusr1.sa_mask; // reuse this sigset_t
sigaddset(set, SIGUSR2);
sigprocmask(SIG_BLOCK, set, nullptr);
}
} scope;