From b204a11cc03ae699b55944fe6d074b2d87af1f7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=BA=AA?= <3049035704@qq.com> Date: Thu, 14 May 2026 02:46:23 +0800 Subject: [PATCH] fix: guard MCP stderr buffer access --- internal/extensions/mcp/client.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/internal/extensions/mcp/client.go b/internal/extensions/mcp/client.go index 25cc1ff4..bf34d3d4 100644 --- a/internal/extensions/mcp/client.go +++ b/internal/extensions/mcp/client.go @@ -12,6 +12,7 @@ import ( "os/exec" "strconv" "strings" + "sync" "time" ) @@ -297,7 +298,7 @@ func (c *StdioClient) runRPC(ctx context.Context, cfg ServerConfig, requests []r if err != nil { return nil, newClientError(ClientErrorTransport, "failed to open mcp stdout pipe", err) } - var stderr bytes.Buffer + var stderr lockedBuffer cmd.Stderr = &stderr if err := cmd.Start(); err != nil { @@ -489,6 +490,23 @@ func stopCommand(cmd *exec.Cmd, stdin io.WriteCloser) { <-done } +type lockedBuffer struct { + mu sync.Mutex + buf bytes.Buffer +} + +func (b *lockedBuffer) Write(p []byte) (int, error) { + b.mu.Lock() + defer b.mu.Unlock() + return b.buf.Write(p) +} + +func (b *lockedBuffer) String() string { + b.mu.Lock() + defer b.mu.Unlock() + return b.buf.String() +} + type rpcRequest struct { JSONRPC string `json:"jsonrpc"` ID any `json:"id,omitempty"`