From 8ed9efa4336ca014dccd14dd304647d50be25314 Mon Sep 17 00:00:00 2001 From: Jay Date: Sun, 9 Aug 2026 18:56:36 -0400 Subject: [PATCH] security: check for channel closures to prevent busy-loops. Move notice observer before channel send. --- auth.go | 10 ++++++++-- notice.go | 13 ++++++++----- publish.go | 10 ++++++++-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/auth.go b/auth.go index 8122fe3..643fd9d 100644 --- a/auth.go +++ b/auth.go @@ -74,7 +74,10 @@ func (m *AuthManager) routeInbox() { select { case <-m.ctx.Done(): return - case msg := <-m.inbox: + case msg, ok := <-m.inbox: + if !ok { + return + } challenge, err := envelope.FindAuthChallenge(msg.Data) if err != nil { continue @@ -116,7 +119,10 @@ func (m *AuthManager) handleEvents() { select { case <-m.ctx.Done(): return - case ev := <-m.events: + case ev, ok := <-m.events: + if !ok { + return + } if ev.Kind == EventDisconnected { m.mu.Lock() m.challenge = "" diff --git a/notice.go b/notice.go index 21062fc..a5eb632 100644 --- a/notice.go +++ b/notice.go @@ -55,21 +55,24 @@ func (h *NoticeHandler) route() { select { case <-h.ctx.Done(): return - case msg := <-h.inbox: + case msg, ok := <-h.inbox: + if !ok { + return + } message, err := envelope.FindNotice(msg.Data) if err != nil { continue } now := time.Now() + h.envoy.Observer().Record(msg.URL, NoticeReceived{ + Message: message, + At: now, + }) h.notices <- Notice{ Peer: msg.URL, Message: message, Timestamp: now, } - h.envoy.Observer().Record(msg.URL, NoticeReceived{ - Message: message, - At: now, - }) } } } diff --git a/publish.go b/publish.go index b80c4cf..ac6babc 100644 --- a/publish.go +++ b/publish.go @@ -170,7 +170,10 @@ func (p *EventPublisher) routeInbox() { select { case <-p.ctx.Done(): return - case msg := <-p.inbox: + case msg, ok := <-p.inbox: + if !ok { + return + } eventID, accepted, message, err := envelope.FindOK(msg.Data) if err != nil { continue @@ -204,7 +207,10 @@ func (p *EventPublisher) handleEvents() { select { case <-p.ctx.Done(): return - case ev := <-p.events: + case ev, ok := <-p.events: + if !ok { + return + } switch ev.Kind { case EventConnected: p.mu.Lock()