mirror of
https://github.com/oven-sh/bun
synced 2026-02-11 11:29:02 +00:00
## Summary - Fixes #20321 - spawnSync crashes with RangeError when stdio is set to process.stderr - Handles file descriptors in stdio array correctly by treating them as non-captured output ## Problem When `spawnSync` is called with `process.stderr` or `process.stdout` in the stdio array, Bun.spawnSync returns the file descriptor number (e.g., 2 for stderr) instead of a buffer or null. This causes a RangeError when the code tries to call `toString(encoding)` on the number, since `Number.prototype.toString()` expects a radix between 2 and 36, not an encoding string. This was blocking AWS CDK usage with Bun, as CDK internally uses `spawnSync` with `stdio: ['ignore', process.stderr, 'inherit']`. ## Solution Check if stdout/stderr from Bun.spawnSync are numbers (file descriptors) and treat them as null (no captured output) instead of trying to convert them to strings. This aligns with Node.js's behavior where in `lib/internal/child_process.js` (lines 1051-1055), when a stdio option is a number or has an `fd` property, it's treated as a file descriptor: ```javascript } else if (typeof stdio === 'number' || typeof stdio.fd === 'number') { ArrayPrototypePush(acc, { type: 'fd', fd: typeof stdio === 'number' ? stdio : stdio.fd, }); ``` And when stdio is a stream object (like process.stderr), Node.js extracts the fd from it (lines 1056-1067) and uses it as a file descriptor, which means the output isn't captured in the result. ## Test plan Added comprehensive regression tests in `test/regression/issue/20321.test.ts` that cover: - process.stderr as stdout - process.stdout as stderr - All process streams in stdio array - Mixed stdio options - Direct file descriptor numbers - The exact AWS CDK use case All tests pass with the fix. 🤖 Generated with [Claude Code](https://claude.ai/code) --------- Co-authored-by: Claude Bot <claude-bot@bun.sh> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
3.1 KiB
3.1 KiB