diff --git a/kernel/poll.cpp b/kernel/poll.cpp index e2b7008c..13629ccc 100644 --- a/kernel/poll.cpp +++ b/kernel/poll.cpp @@ -309,6 +309,7 @@ int sys_ppoll(struct pollfd* user_fds, size_t nfds, { if ( !kthread_cond_wait_signal(&wakeup_cond, &wakeup_mutex) ) { + ret = -1; errno = -EINTR; self_woken = true; deliver_signal = true; @@ -327,7 +328,7 @@ int sys_ppoll(struct pollfd* user_fds, size_t nfds, timer.Detach(); } - if ( !unexpected_error ) + if ( !deliver_signal && !unexpected_error ) { int num_events = 0; for ( size_t i = 0; i < reqs; i++ ) @@ -346,6 +347,9 @@ int sys_ppoll(struct pollfd* user_fds, size_t nfds, if ( 0 <= ret ) errno = 0; + if ( Signal::IsPending() ) + ret = -1, errno = EINTR, deliver_signal = true; + if ( user_sigmask ) { if ( !deliver_signal )