Fix ppoll(2) EINTR handling.

This commit is contained in:
Jonas 'Sortie' Termansen 2024-06-18 17:17:09 +00:00
parent 63a6509396
commit e3af5ae322

View file

@ -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 )