From 8a38c1fdc2c032ae0b5e8e173d63b05c123c642e Mon Sep 17 00:00:00 2001 From: Xiang Fan Date: Sat, 20 Jan 2018 23:47:51 +0800 Subject: [PATCH] kernel: fd: don't notify output-only select events by default Output-only events (B_EVENT_ERROR, B_EVENT_DISCONNECTED and B_EVENT_INVALID, with B_EVENT_INVALID masked out before passing down events) are used to indicate error, so they should not be notified if the filesystem does not explicitly provide an fd_select() override. Bug: 13965 --- src/system/kernel/fs/fd.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/system/kernel/fs/fd.cpp b/src/system/kernel/fs/fd.cpp index 4e50e906ef..25b85d9ea3 100644 --- a/src/system/kernel/fs/fd.cpp +++ b/src/system/kernel/fs/fd.cpp @@ -566,10 +566,14 @@ select_fd(int32 fd, struct select_info* info, bool kernel) uint16 eventsToSelect = info->selected_events & ~B_EVENT_INVALID; - if (descriptor->ops->fd_select == NULL && eventsToSelect != 0) { + if (descriptor->ops->fd_select == NULL) { // if the I/O subsystem doesn't support select(), we will // immediately notify the select call - return notify_select_events(info, eventsToSelect); + eventsToSelect &= ~SELECT_OUTPUT_ONLY_FLAGS; + if (eventsToSelect != 0) + return notify_select_events(info, eventsToSelect); + else + return B_OK; } // We need the FD to stay open while we're doing this, so no select()/