diff --git a/src/kernel/core/fs/vfs.c b/src/kernel/core/fs/vfs.c index 35bfb83322..9eda490226 100755 --- a/src/kernel/core/fs/vfs.c +++ b/src/kernel/core/fs/vfs.c @@ -2708,6 +2708,8 @@ common_poll(struct pollfd *fds, nfds_t numfds, bigtime_t timeout, bool kernel) fds[i].revents = POLLNVAL; continue; } + // clear reported events mask + fds[i].revents = 0; if ((fds[i].events & POLLIN) && select_fd(fd, B_SELECT_READ, MAKE_SELECT_REF(fd, B_SELECT_READ), &sync, kernel) == B_OK) @@ -2774,6 +2776,9 @@ common_poll(struct pollfd *fds, nfds_t numfds, bigtime_t timeout, bool kernel) switch (status) { case B_OK: for (count = 0, i = 0;i < numfds; i++) { + if (fds[i].revents == POLLNVAL) + continue; + // POLLxxx flags and B_SELECT_xxx flags are compatible fds[i].revents = sync.set[i].events; if (fds[i].revents != 0) diff --git a/src/kernel/core/fs/vfs_select.h b/src/kernel/core/fs/vfs_select.h index bf6d7bf687..6be0f2e189 100644 --- a/src/kernel/core/fs/vfs_select.h +++ b/src/kernel/core/fs/vfs_select.h @@ -6,7 +6,7 @@ #define VFS_SELECT_H typedef struct select_info { - uint8 events; + uint16 events; } select_info; typedef struct select_sync {