fix(server/mcp): guard nil dereference in sseManager.get#2557
fix(server/mcp): guard nil dereference in sseManager.get#2557duwenxin99 merged 2 commits intogoogleapis:mainfrom
Conversation
Summary of ChangesHello @marlonbarreto-git, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request addresses a critical bug where the SSE manager could panic due to a nil pointer dereference when attempting to retrieve a non-existent or stale session. The fix ensures robust handling of invalid session IDs, improving the stability of the server's SSE functionality. A new test case has been introduced to validate this behavior. Highlights
Changelog
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
|
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). View this failed invocation of the CLA check for more information. For the most up to date status, view the checks section at the bottom of the pull request. |
There was a problem hiding this comment.
Code Review
This pull request effectively addresses a critical nil pointer dereference issue in the sseManager.get() method by adding a necessary ok guard before accessing session.lastActive. The accompanying test case, TestSseManagerGetNonExistentSession, thoroughly validates the fix, ensuring that the function handles non-existent session IDs gracefully without panicking and returns the expected nil, false.
bb7ae07 to
9579f54
Compare
|
@anubhav756 this PR is ready for review — single commit, CLA signed, conventional commit format. Could you please trigger the CI by applying the All tests pass locally: |
|
Friendly ping @anubhav756 — both this PR and #2558 are ready for review (single commit each, CLA signed, conventional commits). The only blocker is the integration test which needs a maintainer to trigger ( |
|
Hey @duwenxin99, I see you've been on a roll this week with the repo — any chance you could spare a few minutes to glance at this one and #2558? They're both pretty small and self-contained (nil deref guard and a defer fix). Main thing blocking CI is a |
|
/gcbrun |
When a client requests with an unknown session ID, sseManager.get() returns the zero value (nil) from the map lookup but unconditionally accesses session.lastActive, causing a nil pointer dereference panic. Add an ok-check before updating lastActive. Fixes googleapis#2548
7d4ce21 to
50381b0
Compare
|
/gcbrun |
…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 googleapis#2548 Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- ## [0.28.0](v0.27.0...v0.28.0) (2026-03-02) ### Features * Add polling system to dynamic reloading ([#2466](#2466)) ([fcaac9b](fcaac9b)) * Added basic template for sdks doc migrate ([#1961](#1961)) ([87f2eaf](87f2eaf)) * **dataproc:** Add dataproc source and list/get clusters/jobs tools ([#2407](#2407)) ([cc05e57](cc05e57)) * **sources/postgres:** Add configurable pgx query execution mode ([#2477](#2477)) ([57b77bc](57b77bc)) * **sources/redis:** Add TLS support for Redis connections ([#2432](#2432)) ([d6af290](d6af290)) * **tools/looker:** Enable Get All Lookml Tests, Run LookML Tests, and Create View From Table tools for Looker ([#2522](#2522)) ([e01139a](e01139a)) * **tools/looker:** Tools to list/create/delete directories ([#2488](#2488)) ([0036d8c](0036d8c)) * **ui:** Make tool list panel resizable ([#2253](#2253)) ([276cf60](276cf60)) ### Bug Fixes * **ci:** Add path for forked PR unit test runs ([#2540](#2540)) ([04dd2a7](04dd2a7)) * Deflake alloydb omni ([#2431](#2431)) ([62b8309](62b8309)) * **docs/adk:** Resolve dependency duplication ([#2418](#2418)) ([4d44abb](4d44abb)) * **docs/langchain:** Fix core at 0.3.0 and align compatible dependencies ([#2426](#2426)) ([36edfd3](36edfd3)) * Enforce required validation for explicit null parameter values ([#2519](#2519)) ([d5e9512](d5e9512)) * **oracle:** Enable DML operations and resolve incorrect array type error ([#2323](#2323)) ([72146a4](72146a4)) * **server/mcp:** Guard nil dereference in sseManager.get ([#2557](#2557)) ([e534196](e534196)), closes [#2548](#2548) * **tests/postgres:** Implement uuid-based isolation and reliable resource cleanup ([#2377](#2377)) ([8a96fb1](8a96fb1)) * **tests/postgres:** Restore list_schemas test and implement dynamic owner ([#2521](#2521)) ([7041e79](7041e79)) * **tests:** Resolve LlamaIndex dependency conflict in JS quickstart ([#2597](#2597)) ([ac11f5a](ac11f5a)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- ## [0.28.0](v0.27.0...v0.28.0) (2026-03-02) ### Features * Add polling system to dynamic reloading ([#2466](#2466)) ([fcaac9b](fcaac9b)) * Added basic template for sdks doc migrate ([#1961](#1961)) ([87f2eaf](87f2eaf)) * **dataproc:** Add dataproc source and list/get clusters/jobs tools ([#2407](#2407)) ([cc05e57](cc05e57)) * **sources/postgres:** Add configurable pgx query execution mode ([#2477](#2477)) ([57b77bc](57b77bc)) * **sources/redis:** Add TLS support for Redis connections ([#2432](#2432)) ([d6af290](d6af290)) * **tools/looker:** Enable Get All Lookml Tests, Run LookML Tests, and Create View From Table tools for Looker ([#2522](#2522)) ([e01139a](e01139a)) * **tools/looker:** Tools to list/create/delete directories ([#2488](#2488)) ([0036d8c](0036d8c)) * **ui:** Make tool list panel resizable ([#2253](#2253)) ([276cf60](276cf60)) ### Bug Fixes * **ci:** Add path for forked PR unit test runs ([#2540](#2540)) ([04dd2a7](04dd2a7)) * Deflake alloydb omni ([#2431](#2431)) ([62b8309](62b8309)) * **docs/adk:** Resolve dependency duplication ([#2418](#2418)) ([4d44abb](4d44abb)) * **docs/langchain:** Fix core at 0.3.0 and align compatible dependencies ([#2426](#2426)) ([36edfd3](36edfd3)) * Enforce required validation for explicit null parameter values ([#2519](#2519)) ([d5e9512](d5e9512)) * **oracle:** Enable DML operations and resolve incorrect array type error ([#2323](#2323)) ([72146a4](72146a4)) * **server/mcp:** Guard nil dereference in sseManager.get ([#2557](#2557)) ([e534196](e534196)), closes [#2548](#2548) * **tests/postgres:** Implement uuid-based isolation and reliable resource cleanup ([#2377](#2377)) ([8a96fb1](8a96fb1)) * **tests/postgres:** Restore list_schemas test and implement dynamic owner ([#2521](#2521)) ([7041e79](7041e79)) * **tests:** Resolve LlamaIndex dependency conflict in JS quickstart ([#2597](#2597)) ([ac11f5a](ac11f5a)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com> 81253a0
🤖 I have created a release *beep* *boop* --- ## [0.28.0](googleapis/mcp-toolbox@v0.27.0...v0.28.0) (2026-03-02) ### Features * Add polling system to dynamic reloading ([googleapis#2466](googleapis#2466)) ([fcaac9b](googleapis@fcaac9b)) * Added basic template for sdks doc migrate ([googleapis#1961](googleapis#1961)) ([87f2eaf](googleapis@87f2eaf)) * **dataproc:** Add dataproc source and list/get clusters/jobs tools ([googleapis#2407](googleapis#2407)) ([cc05e57](googleapis@cc05e57)) * **sources/postgres:** Add configurable pgx query execution mode ([googleapis#2477](googleapis#2477)) ([57b77bc](googleapis@57b77bc)) * **sources/redis:** Add TLS support for Redis connections ([googleapis#2432](googleapis#2432)) ([d6af290](googleapis@d6af290)) * **tools/looker:** Enable Get All Lookml Tests, Run LookML Tests, and Create View From Table tools for Looker ([googleapis#2522](googleapis#2522)) ([e01139a](googleapis@e01139a)) * **tools/looker:** Tools to list/create/delete directories ([googleapis#2488](googleapis#2488)) ([0036d8c](googleapis@0036d8c)) * **ui:** Make tool list panel resizable ([googleapis#2253](googleapis#2253)) ([276cf60](googleapis@276cf60)) ### Bug Fixes * **ci:** Add path for forked PR unit test runs ([googleapis#2540](googleapis#2540)) ([04dd2a7](googleapis@04dd2a7)) * Deflake alloydb omni ([googleapis#2431](googleapis#2431)) ([62b8309](googleapis@62b8309)) * **docs/adk:** Resolve dependency duplication ([googleapis#2418](googleapis#2418)) ([4d44abb](googleapis@4d44abb)) * **docs/langchain:** Fix core at 0.3.0 and align compatible dependencies ([googleapis#2426](googleapis#2426)) ([36edfd3](googleapis@36edfd3)) * Enforce required validation for explicit null parameter values ([googleapis#2519](googleapis#2519)) ([d5e9512](googleapis@d5e9512)) * **oracle:** Enable DML operations and resolve incorrect array type error ([googleapis#2323](googleapis#2323)) ([72146a4](googleapis@72146a4)) * **server/mcp:** Guard nil dereference in sseManager.get ([googleapis#2557](googleapis#2557)) ([e534196](googleapis@e534196)), closes [googleapis#2548](googleapis#2548) * **tests/postgres:** Implement uuid-based isolation and reliable resource cleanup ([googleapis#2377](googleapis#2377)) ([8a96fb1](googleapis@8a96fb1)) * **tests/postgres:** Restore list_schemas test and implement dynamic owner ([googleapis#2521](googleapis#2521)) ([7041e79](googleapis@7041e79)) * **tests:** Resolve LlamaIndex dependency conflict in JS quickstart ([googleapis#2597](googleapis#2597)) ([ac11f5a](googleapis@ac11f5a)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com> 81253a0
🤖 I have created a release *beep* *boop* --- ## [0.28.0](googleapis/mcp-toolbox@v0.27.0...v0.28.0) (2026-03-02) ### Features * Add polling system to dynamic reloading ([#2466](googleapis/mcp-toolbox#2466)) ([fcaac9b](googleapis/mcp-toolbox@fcaac9b)) * Added basic template for sdks doc migrate ([#1961](googleapis/mcp-toolbox#1961)) ([87f2eaf](googleapis/mcp-toolbox@87f2eaf)) * **dataproc:** Add dataproc source and list/get clusters/jobs tools ([#2407](googleapis/mcp-toolbox#2407)) ([cc05e57](googleapis/mcp-toolbox@cc05e57)) * **sources/postgres:** Add configurable pgx query execution mode ([#2477](googleapis/mcp-toolbox#2477)) ([57b77bc](googleapis/mcp-toolbox@57b77bc)) * **sources/redis:** Add TLS support for Redis connections ([#2432](googleapis/mcp-toolbox#2432)) ([d6af290](googleapis/mcp-toolbox@d6af290)) * **tools/looker:** Enable Get All Lookml Tests, Run LookML Tests, and Create View From Table tools for Looker ([#2522](googleapis/mcp-toolbox#2522)) ([e01139a](googleapis/mcp-toolbox@e01139a)) * **tools/looker:** Tools to list/create/delete directories ([#2488](googleapis/mcp-toolbox#2488)) ([0036d8c](googleapis/mcp-toolbox@0036d8c)) * **ui:** Make tool list panel resizable ([#2253](googleapis/mcp-toolbox#2253)) ([276cf60](googleapis/mcp-toolbox@276cf60)) ### Bug Fixes * **ci:** Add path for forked PR unit test runs ([#2540](googleapis/mcp-toolbox#2540)) ([04dd2a7](googleapis/mcp-toolbox@04dd2a7)) * Deflake alloydb omni ([#2431](googleapis/mcp-toolbox#2431)) ([62b8309](googleapis/mcp-toolbox@62b8309)) * **docs/adk:** Resolve dependency duplication ([#2418](googleapis/mcp-toolbox#2418)) ([4d44abb](googleapis/mcp-toolbox@4d44abb)) * **docs/langchain:** Fix core at 0.3.0 and align compatible dependencies ([#2426](googleapis/mcp-toolbox#2426)) ([36edfd3](googleapis/mcp-toolbox@36edfd3)) * Enforce required validation for explicit null parameter values ([#2519](googleapis/mcp-toolbox#2519)) ([d5e9512](googleapis/mcp-toolbox@d5e9512)) * **oracle:** Enable DML operations and resolve incorrect array type error ([#2323](googleapis/mcp-toolbox#2323)) ([72146a4](googleapis/mcp-toolbox@72146a4)) * **server/mcp:** Guard nil dereference in sseManager.get ([#2557](googleapis/mcp-toolbox#2557)) ([e534196](googleapis/mcp-toolbox@e534196)), closes [#2548](googleapis/mcp-toolbox#2548) * **tests/postgres:** Implement uuid-based isolation and reliable resource cleanup ([#2377](googleapis/mcp-toolbox#2377)) ([8a96fb1](googleapis/mcp-toolbox@8a96fb1)) * **tests/postgres:** Restore list_schemas test and implement dynamic owner ([#2521](googleapis/mcp-toolbox#2521)) ([7041e79](googleapis/mcp-toolbox@7041e79)) * **tests:** Resolve LlamaIndex dependency conflict in JS quickstart ([#2597](googleapis/mcp-toolbox#2597)) ([ac11f5a](googleapis/mcp-toolbox@ac11f5a)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
…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 googleapis#2548 Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- ## [0.28.0](googleapis/mcp-toolbox@v0.27.0...v0.28.0) (2026-03-02) ### Features * Add polling system to dynamic reloading ([googleapis#2466](googleapis#2466)) ([fcaac9b](googleapis@fcaac9b)) * Added basic template for sdks doc migrate ([googleapis#1961](googleapis#1961)) ([87f2eaf](googleapis@87f2eaf)) * **dataproc:** Add dataproc source and list/get clusters/jobs tools ([googleapis#2407](googleapis#2407)) ([cc05e57](googleapis@cc05e57)) * **sources/postgres:** Add configurable pgx query execution mode ([googleapis#2477](googleapis#2477)) ([57b77bc](googleapis@57b77bc)) * **sources/redis:** Add TLS support for Redis connections ([googleapis#2432](googleapis#2432)) ([d6af290](googleapis@d6af290)) * **tools/looker:** Enable Get All Lookml Tests, Run LookML Tests, and Create View From Table tools for Looker ([googleapis#2522](googleapis#2522)) ([e01139a](googleapis@e01139a)) * **tools/looker:** Tools to list/create/delete directories ([googleapis#2488](googleapis#2488)) ([0036d8c](googleapis@0036d8c)) * **ui:** Make tool list panel resizable ([googleapis#2253](googleapis#2253)) ([276cf60](googleapis@276cf60)) ### Bug Fixes * **ci:** Add path for forked PR unit test runs ([googleapis#2540](googleapis#2540)) ([04dd2a7](googleapis@04dd2a7)) * Deflake alloydb omni ([googleapis#2431](googleapis#2431)) ([62b8309](googleapis@62b8309)) * **docs/adk:** Resolve dependency duplication ([googleapis#2418](googleapis#2418)) ([4d44abb](googleapis@4d44abb)) * **docs/langchain:** Fix core at 0.3.0 and align compatible dependencies ([googleapis#2426](googleapis#2426)) ([36edfd3](googleapis@36edfd3)) * Enforce required validation for explicit null parameter values ([googleapis#2519](googleapis#2519)) ([d5e9512](googleapis@d5e9512)) * **oracle:** Enable DML operations and resolve incorrect array type error ([googleapis#2323](googleapis#2323)) ([72146a4](googleapis@72146a4)) * **server/mcp:** Guard nil dereference in sseManager.get ([googleapis#2557](googleapis#2557)) ([e534196](googleapis@e534196)), closes [googleapis#2548](googleapis#2548) * **tests/postgres:** Implement uuid-based isolation and reliable resource cleanup ([googleapis#2377](googleapis#2377)) ([8a96fb1](googleapis@8a96fb1)) * **tests/postgres:** Restore list_schemas test and implement dynamic owner ([googleapis#2521](googleapis#2521)) ([7041e79](googleapis@7041e79)) * **tests:** Resolve LlamaIndex dependency conflict in JS quickstart ([googleapis#2597](googleapis#2597)) ([ac11f5a](googleapis@ac11f5a)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
Description
sseManager.get()unconditionally accessessession.lastActiveafter a map lookup, even when the session ID doesn't exist. Since the zero value for a*sseSessionpointer isnil, this causes a nil pointer dereference panic at runtime.This can happen when a client sends a request with a stale or invalid
sessionIdquery parameter — for example, after a network reconnection or if a session was cleaned up bycleanupRoutine.Changes
Add an
okguard before accessingsession.lastActive:Test
Added
TestSseManagerGetNonExistentSessionthat callsget()with a non-existent ID and verifies it returnsnil, falsewithout panicking.Fixes #2548