summaryrefslogtreecommitdiff
path: root/kernel/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/signal.c')
-rw-r--r--kernel/signal.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index 51e43e17d1c6..12be8ef85d82 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -3192,6 +3192,16 @@ long do_no_restart_syscall(struct restart_block *param)
static void __set_task_blocked(struct task_struct *tsk, const sigset_t *newset)
{
+ sigset_t floor, floored;
+
+ /* A user worker never unblocks anything but SIGKILL and SIGSTOP. */
+ if (unlikely(tsk->flags & PF_USER_WORKER)) {
+ siginitsetinv(&floor, SIG_KERNEL_ONLY_MASK);
+ sigorsets(&floored, newset, &floor);
+ WARN_ON_ONCE(!sigequalsets(&floored, newset));
+ newset = &floored;
+ }
+
if (task_sigpending(tsk) && !thread_group_empty(tsk)) {
sigset_t newblocked;
/* A set of now blocked but previously unblocked signals. */