From a7b5a58509f9ad5f161118a71aa7268da64c6d1f Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 15 Mar 2021 19:11:48 +0100 Subject: [PATCH] Kernel: Fix sys$select() not marking fd's after blocking was avoided In case multiple file descriptors in the `fd_set` were already readable and/or writable when calling Thread::block(), we would only mark the first fd in the output sets instead of all relevant fd's. The short-circuit code path when blocking isn't necessary must ensure that unblock flags are collected for all file descriptors, not just the first one encountered. Fixes #5795. --- Kernel/ThreadBlockers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Kernel/ThreadBlockers.cpp b/Kernel/ThreadBlockers.cpp index 6794cdea6a..0db5543bf5 100644 --- a/Kernel/ThreadBlockers.cpp +++ b/Kernel/ThreadBlockers.cpp @@ -385,7 +385,7 @@ void Thread::SelectBlocker::not_blocking(bool timeout_in_past) // Either the timeout was in the past or we didn't add all blockers VERIFY(timeout_in_past || !m_should_block); ScopedSpinLock lock(m_lock); - if (!m_did_unblock) { + if (!m_should_block || !m_did_unblock) { m_did_unblock = true; if (!timeout_in_past) { auto count = collect_unblocked_flags();