A random wakeup can get us out of sigsuspend() without TIF_SIGPENDING being set.
Avoid that by making sure we were signaled, like sys_pause() does. Signed-off-by: Sasha Levin <[email protected]> --- kernel/signal.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel/signal.c b/kernel/signal.c index 5da9180..3256c7e 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -3528,8 +3528,10 @@ static int sigsuspend(sigset_t *set) current->saved_sigmask = current->blocked; set_current_blocked(set); - __set_current_state(TASK_INTERRUPTIBLE); - schedule(); + while (!signal_pending(current)) { + __set_current_state(TASK_INTERRUPTIBLE); + schedule(); + } set_restore_sigmask(); return -ERESTARTNOHAND; } -- 1.7.10.4

