diff --git a/Kernel/Syscalls/poll.cpp b/Kernel/Syscalls/poll.cpp index 79efa69433..c0a08c484f 100644 --- a/Kernel/Syscalls/poll.cpp +++ b/Kernel/Syscalls/poll.cpp @@ -51,7 +51,7 @@ ErrorOr Process::sys$poll(Userspace use for (size_t i = 0; i < params.nfds; i++) { auto& pfd = fds_copy[i]; auto description = TRY(fds.open_file_description(pfd.fd)); - BlockFlags block_flags = BlockFlags::Exception; // always want POLLERR, POLLHUP, POLLNVAL + BlockFlags block_flags = BlockFlags::WriteError | BlockFlags::WriteHangUp; // always want POLLERR, POLLHUP, POLLNVAL if (pfd.events & POLLIN) block_flags |= BlockFlags::Read; if (pfd.events & POLLOUT) @@ -60,6 +60,8 @@ ErrorOr Process::sys$poll(Userspace use block_flags |= BlockFlags::ReadPriority; if (pfd.events & POLLWRBAND) block_flags |= BlockFlags::WritePriority; + if (pfd.events & POLLRDHUP) + block_flags |= BlockFlags::ReadHangUp; fds_info.unchecked_append({ move(description), block_flags }); } return {}; @@ -91,9 +93,7 @@ ErrorOr Process::sys$poll(Userspace use if (fds_entry.unblocked_flags == BlockFlags::None) continue; - if (has_any_flag(fds_entry.unblocked_flags, BlockFlags::Exception)) { - if (has_flag(fds_entry.unblocked_flags, BlockFlags::ReadHangUp)) - pfd.revents |= POLLRDHUP; + if (has_any_flag(fds_entry.unblocked_flags, BlockFlags::WriteError | BlockFlags::WriteHangUp)) { if (has_flag(fds_entry.unblocked_flags, BlockFlags::WriteError)) pfd.revents |= POLLERR; if (has_flag(fds_entry.unblocked_flags, BlockFlags::WriteHangUp)) @@ -115,6 +115,10 @@ ErrorOr Process::sys$poll(Userspace use VERIFY(pfd.events & POLLWRBAND); pfd.revents |= POLLWRBAND; } + if (has_flag(fds_entry.unblocked_flags, BlockFlags::ReadHangUp)) { + VERIFY(pfd.events & POLLRDHUP); + pfd.revents |= POLLRDHUP; + } } if (pfd.revents) fds_with_revents++;