From 5ba3c3de8e1b0718f57adcf878c66abe0d30aa87 Mon Sep 17 00:00:00 2001 From: sergiu128 Date: Sun, 14 Apr 2024 16:51:02 +0200 Subject: [PATCH] Ensure poller events do not overlap --- internal/poll_bsd.go | 12 ++++++++++++ internal/poll_linux.go | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/internal/poll_bsd.go b/internal/poll_bsd.go index e911b03..49e9080 100644 --- a/internal/poll_bsd.go +++ b/internal/poll_bsd.go @@ -4,6 +4,7 @@ package internal import ( "errors" + "fmt" "io" "sync" "sync/atomic" @@ -23,6 +24,17 @@ const ( PollerWriteEvent = -PollerEvent(syscall.EVFILT_WRITE) ) +func init() { + // The read and write events are used to set/unset bits in a Slot's event mask. We dispatch the read/write handler + // based on this event mask, so we must ensure they don't overlap. + if PollerReadEvent|PollerWriteEvent == PollerReadEvent || PollerReadEvent|PollerWriteEvent == PollerWriteEvent { + panic(fmt.Sprintf( + "PollerReadEvent=%d and PollerWriteEvent=%d overlap", + PollerReadEvent, PollerWriteEvent, + )) + } +} + var _ Poller = &poller{} type poller struct { diff --git a/internal/poll_linux.go b/internal/poll_linux.go index 91969f8..94bb2f6 100644 --- a/internal/poll_linux.go +++ b/internal/poll_linux.go @@ -4,6 +4,7 @@ package internal import ( "errors" + "fmt" "io" "os" "sync" @@ -21,6 +22,17 @@ const ( PollerWriteEvent = PollerEvent(syscall.EPOLLOUT) ) +func init() { + // The read and write events are used to set/unset bits in a Slot's event mask. We dispatch the read/write handler + // based on this event mask, so we must ensure they don't overlap. + if PollerReadEvent|PollerWriteEvent == PollerReadEvent || PollerReadEvent|PollerWriteEvent == PollerWriteEvent { + panic(fmt.Sprintf( + "PollerReadEvent=%d and PollerWriteEvent=%d overlap", + PollerReadEvent, PollerWriteEvent, + )) + } +} + type Event struct { Mask uint32 Data [8]byte