fix(runtime): guard onToolsChanged like onBackgroundEvent (#3594)#3609
Draft
aheritier wants to merge 1 commit into
Draft
fix(runtime): guard onToolsChanged like onBackgroundEvent (#3594)#3609aheritier wants to merge 1 commit into
aheritier wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #3594 —
onToolsChangedwas written and read from MCPchange-notification goroutines with no synchronization, while its sibling
onBackgroundEventis already mutex-guarded (backgroundEventMu) with acomment explaining exactly this hazard.
This is finding A5 from the internal codebase audit.
What changed
onToolsChangedis now guarded by a newtoolsChangedMu sync.RWMutex,faithfully mirroring the
onBackgroundEvent/backgroundEventMuprecedent:the setter writes under the write lock;
emitToolsChangedcopies the handlerunder the read lock and then releases it before reading tools,
constructing the event, and invoking the handler (never holding the mutex
across the callback).
Testing
pkg/runtime/ontoolschanged_race_test.go— concurrent register + emit.Verified to fail (data race at the setter write + the two reads) against the
pre-fix unguarded code and pass now.
task dev+go test -race -count=2 ./pkg/runtime/...: green (validated inisolation).
Opened as a draft pending final maintainer review.