Skip to content

Commit ccd59d7

Browse files
author
MSCodeBase Agent
committed
fix(sandbox): binary mode subprocess to fix Windows pipe deadlock (§5.16)
- Remove text=True, encoding='utf-8' from Popen — causes pipe buffer deadlock when MCP server redirects stdout for JSON-RPC - Decode stdout/stderr manually with .decode('utf-8', errors='replace') - Pattern matches §5.16: Popen(PIPE) + communicate(timeout) + binary - Sandbox tests: 34/34 passed. execute_script in MCP runtime: needs server restart to pick up this change.
1 parent 58dd4af commit ccd59d7

1 file changed

Lines changed: 7 additions & 4 deletions

File tree

src/core/sandbox/executor.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -336,25 +336,28 @@ def execute_sandboxed(
336336
creationflags = subprocess.CREATE_NO_WINDOW
337337

338338
try:
339+
# Binary mode to avoid pipe buffer deadlock on Windows (§5.16)
339340
proc = subprocess.Popen(
340341
[sys.executable, "-c", script],
341342
stdout=subprocess.PIPE,
342343
stderr=subprocess.PIPE,
343344
cwd=cwd,
344345
env=env,
345346
creationflags=creationflags,
346-
text=True,
347-
encoding="utf-8",
348347
)
349-
stdout, stderr = proc.communicate(timeout=timeout)
348+
raw_out, raw_err = proc.communicate(timeout=timeout)
349+
stdout = raw_out.decode("utf-8", errors="replace") if raw_out else ""
350+
stderr = raw_err.decode("utf-8", errors="replace") if raw_err else ""
350351
exit_code = proc.returncode
351352
timed_out = False
352353
except subprocess.TimeoutExpired:
353354
try:
354355
proc.kill()
355356
except OSError:
356357
pass # Process may have already exited between timeout and kill
357-
stdout, stderr = proc.communicate()
358+
raw_out, raw_err = proc.communicate()
359+
stdout = raw_out.decode("utf-8", errors="replace") if raw_out else ""
360+
stderr = raw_err.decode("utf-8", errors="replace") if raw_err else ""
358361
exit_code = -1
359362
timed_out = True
360363
except Exception as e:

0 commit comments

Comments
 (0)