From e6d9dc2731beefa88818c1b3c061dddb701a9991 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Wed, 25 Mar 2026 15:04:33 -0400 Subject: [PATCH] kqueue: Don't notify B_EVENT_INVALID for FDs. It isn't sent at all on FreeBSD. Found while testing #19969: the disconnection was reported twice. Change-Id: Icaf7abef7c3c3a61fccf5eb9e827e0a6a0fa1228 Reviewed-on: https://review.haiku-os.org/c/haiku/+/10580 Tested-by: Commit checker robot Reviewed-by: waddlesplash --- src/libs/bsd/kqueue.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/libs/bsd/kqueue.cpp b/src/libs/bsd/kqueue.cpp index c4ab5509e3..f25cc1786c 100644 --- a/src/libs/bsd/kqueue.cpp +++ b/src/libs/bsd/kqueue.cpp @@ -76,7 +76,8 @@ kevent(int kq, break; default: - return EINVAL; + __set_errno(EINVAL); + return -1; } if ((changelist[i].flags & EV_ONESHOT) != 0) @@ -207,13 +208,11 @@ kevent(int kq, if (waitInfos[i].events < 0) { flags |= EV_ERROR; data = waitInfos[i].events; - } else if ((waitInfos[i].events & B_EVENT_DISCONNECTED) != 0) { - flags |= EV_EOF; } else if ((waitInfos[i].events & B_EVENT_INVALID) != 0) { switch (waitInfos[i].type) { case B_OBJECT_TYPE_FD: - flags |= EV_EOF; - break; + // File descriptor was closed. Silently discard the event. + continue; case B_OBJECT_TYPE_THREAD: { fflags |= NOTE_EXIT; @@ -227,6 +226,8 @@ kevent(int kq, break; } } + } else if ((waitInfos[i].events & B_EVENT_DISCONNECTED) != 0) { + flags |= EV_EOF; } else if ((waitInfos[i].events & B_EVENT_ERROR) != 0) { flags |= EV_ERROR; data = EINVAL;