process-util: do not unblock unrelated signals while forking
This makes sure when we are blocking signals in preparation for fork() we'll not temporarily unblock any signals previously set, by mistake. It's safe for us to block more, but not to unblock signals already blocked. Fix that. Fixes: #35470
This commit is contained in:
committed by
Yu Watanabe
parent
a71731bd2e
commit
7893362508
@@ -1402,11 +1402,6 @@ int must_be_root(void) {
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EPERM), "Need to be root.");
|
||||
}
|
||||
|
||||
static void restore_sigsetp(sigset_t **ssp) {
|
||||
if (*ssp)
|
||||
(void) sigprocmask(SIG_SETMASK, *ssp, NULL);
|
||||
}
|
||||
|
||||
pid_t clone_with_nested_stack(int (*fn)(void *), int flags, void *userdata) {
|
||||
size_t ps;
|
||||
pid_t pid;
|
||||
@@ -1446,6 +1441,11 @@ pid_t clone_with_nested_stack(int (*fn)(void *), int flags, void *userdata) {
|
||||
return pid;
|
||||
}
|
||||
|
||||
static void restore_sigsetp(sigset_t **ssp) {
|
||||
if (*ssp)
|
||||
(void) sigprocmask(SIG_SETMASK, *ssp, NULL);
|
||||
}
|
||||
|
||||
static int fork_flags_to_signal(ForkFlags flags) {
|
||||
return (flags & FORK_DEATHSIG_SIGTERM) ? SIGTERM :
|
||||
(flags & FORK_DEATHSIG_SIGINT) ? SIGINT :
|
||||
@@ -1498,8 +1498,8 @@ int safe_fork_full(
|
||||
}
|
||||
|
||||
if (block_signals) {
|
||||
if (sigprocmask(SIG_SETMASK, &ss, &saved_ss) < 0)
|
||||
return log_full_errno(prio, errno, "Failed to set signal mask: %m");
|
||||
if (sigprocmask(SIG_BLOCK, &ss, &saved_ss) < 0)
|
||||
return log_full_errno(prio, errno, "Failed to block signal mask: %m");
|
||||
saved_ssp = &saved_ss;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user