From 1705e6ef579039986ded5df0b7af790216587245 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 18 Apr 2026 08:36:29 +0100 Subject: [PATCH] Harden websocket nil handling --- pkg/display/events.go | 9 +++++---- pkg/display/events_test.go | 11 +++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pkg/display/events.go b/pkg/display/events.go index 2e191d58..3462cd8d 100644 --- a/pkg/display/events.go +++ b/pkg/display/events.go @@ -260,10 +260,11 @@ func (em *WSEventManager) sendEvent(conn *websocket.Conn, event Event) { // HandleWebSocket handles WebSocket upgrade and connection. func (em *WSEventManager) HandleWebSocket(w http.ResponseWriter, r *http.Request) { - if em == nil { - if w != nil { - http.Error(w, http.StatusText(http.StatusServiceUnavailable), http.StatusServiceUnavailable) - } + if w == nil { + return + } + if em == nil || r == nil { + http.Error(w, http.StatusText(http.StatusServiceUnavailable), http.StatusServiceUnavailable) return } em.mu.RLock() diff --git a/pkg/display/events_test.go b/pkg/display/events_test.go index f2f8709e..012a762e 100644 --- a/pkg/display/events_test.go +++ b/pkg/display/events_test.go @@ -180,6 +180,17 @@ func TestWSEventManager_HandleWebSocket_NilReceiverFailsClosed(t *testing.T) { assert.Equal(t, http.StatusServiceUnavailable, recorder.Code) } +func TestWSEventManager_HandleWebSocket_NilWriterFailsClosed(t *testing.T) { + em := NewWSEventManager() + + req := httptest.NewRequest(http.MethodGet, "http://127.0.0.1/events", nil) + req.RemoteAddr = "127.0.0.1:12345" + + assert.NotPanics(t, func() { + em.HandleWebSocket(nil, req) + }) +} + func TestWSEventManager_HandleWebSocket_RejectsAfterClose(t *testing.T) { em := NewWSEventManager() em.Close()