From 2d841bae7cd85278ea7a507ae140379f0dea3d1a Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Wed, 14 Jul 2021 01:09:40 +0200 Subject: [PATCH] Fix kernel deadlock in ppoll(2). --- kernel/poll.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/poll.cpp b/kernel/poll.cpp index fc3f431d..e2b7008c 100644 --- a/kernel/poll.cpp +++ b/kernel/poll.cpp @@ -249,8 +249,6 @@ int sys_ppoll(struct pollfd* user_fds, size_t nfds, kthread_mutex_t wakeup_mutex = KTHREAD_MUTEX_INITIALIZER; kthread_cond_t wakeup_cond = KTHREAD_COND_INITIALIZER; - kthread_mutex_lock(&wakeup_mutex); - int ret = -1; bool self_woken = false; bool remote_woken = false; @@ -305,6 +303,8 @@ int sys_ppoll(struct pollfd* user_fds, size_t nfds, if ( timeout_ts.tv_sec == 0 && timeout_ts.tv_nsec == 0 ) self_woken = true; + kthread_mutex_lock(&wakeup_mutex); + while ( !(self_woken || remote_woken) ) { if ( !kthread_cond_wait_signal(&wakeup_cond, &wakeup_mutex) )