Skip to content

Commit e534196

Browse files
fix(server/mcp): guard nil dereference in sseManager.get (#2557)
## Description `sseManager.get()` unconditionally accesses `session.lastActive` after a map lookup, even when the session ID doesn't exist. Since the zero value for a `*sseSession` pointer is `nil`, this causes a nil pointer dereference panic at runtime. This can happen when a client sends a request with a stale or invalid `sessionId` query parameter — for example, after a network reconnection or if a session was cleaned up by `cleanupRoutine`. ## Changes Add an `ok` guard before accessing `session.lastActive`: ```go session, ok := m.sseSessions[id] if ok { session.lastActive = time.Now() } ``` ## Test Added `TestSseManagerGetNonExistentSession` that calls `get()` with a non-existent ID and verifies it returns `nil, false` without panicking. Fixes #2548 Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
1 parent fcaac9b commit e534196

2 files changed

Lines changed: 19 additions & 1 deletion

File tree

internal/server/mcp.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ func (m *sseManager) get(id string) (*sseSession, bool) {
6161
m.mu.Lock()
6262
defer m.mu.Unlock()
6363
session, ok := m.sseSessions[id]
64-
session.lastActive = time.Now()
64+
if ok {
65+
session.lastActive = time.Now()
66+
}
6567
return session, ok
6668
}
6769

internal/server/mcp_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,3 +1168,19 @@ func TestStdioSession(t *testing.T) {
11681168
t.Fatalf("unexpected read: got %s, want %s", read, want)
11691169
}
11701170
}
1171+
1172+
func TestSseManagerGetNonExistentSession(t *testing.T) {
1173+
ctx, cancel := context.WithCancel(context.Background())
1174+
defer cancel()
1175+
1176+
m := newSseManager(ctx)
1177+
1178+
// Must not panic when session ID doesn't exist in the map.
1179+
session, ok := m.get("non-existent-id")
1180+
if ok {
1181+
t.Error("expected ok to be false for non-existent session")
1182+
}
1183+
if session != nil {
1184+
t.Error("expected nil session for non-existent ID")
1185+
}
1186+
}

0 commit comments

Comments
 (0)