소스 검색

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<SelectBlocker>(), 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.
Andreas Kling 4 년 전
부모
커밋
a7b5a58509
1개의 변경된 파일1개의 추가작업 그리고 1개의 파일을 삭제
  1. 1 1
      Kernel/ThreadBlockers.cpp

+ 1 - 1
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();