mirror of
https://github.com/oven-sh/bun
synced 2026-02-15 21:32:05 +00:00
## Summary - **`seq inf` / `seq nan` / `seq -inf` hang**: `std.fmt.parseFloat` accepts non-finite float values like `inf`, `nan`, `-inf`, but the loop `while (current <= this._end)` never terminates when `_end` is infinity. Now rejects non-finite values after parsing. - **`[[ -d "" ]]` out-of-bounds panic**: Empty string expansion produces no args in the args list, but `doStat()` unconditionally accesses `args.items[0]`. Now checks `args.items.len == 0` before calling `doStat()` and returns exit code 1 (path doesn't exist). ## Test plan - [x] `seq inf`, `seq nan`, `seq -inf` return exit code 1 with "invalid argument" instead of hanging - [x] `[[ -d "" ]]` and `[[ -f "" ]]` return exit code 1 instead of panicking - [x] `seq 3` still works normally (produces 1, 2, 3) - [x] `[[ -d /tmp ]]`, `[[ -f /etc/hostname ]]` still work correctly - [x] Tests pass with `bun bd test`, seq tests fail with `USE_SYSTEM_BUN=1` 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
86 lines
2.3 KiB
TypeScript
86 lines
2.3 KiB
TypeScript
import { expect, test } from "bun:test";
|
|
import { bunEnv, bunExe } from "harness";
|
|
|
|
test("seq inf does not hang", async () => {
|
|
await using proc = Bun.spawn({
|
|
cmd: [
|
|
bunExe(),
|
|
"-e",
|
|
`import { $ } from "bun"; $.throws(false); const r = await $\`seq inf\`; process.exit(r.exitCode)`,
|
|
],
|
|
env: bunEnv,
|
|
stderr: "pipe",
|
|
});
|
|
|
|
const [stdout, stderr, exitCode] = await Promise.all([proc.stdout.text(), proc.stderr.text(), proc.exited]);
|
|
|
|
expect(stderr).toContain("invalid argument");
|
|
expect(exitCode).toBe(1);
|
|
}, 10_000);
|
|
|
|
test("seq nan does not hang", async () => {
|
|
await using proc = Bun.spawn({
|
|
cmd: [
|
|
bunExe(),
|
|
"-e",
|
|
`import { $ } from "bun"; $.throws(false); const r = await $\`seq nan\`; process.exit(r.exitCode)`,
|
|
],
|
|
env: bunEnv,
|
|
stderr: "pipe",
|
|
});
|
|
|
|
const [stdout, stderr, exitCode] = await Promise.all([proc.stdout.text(), proc.stderr.text(), proc.exited]);
|
|
|
|
expect(stderr).toContain("invalid argument");
|
|
expect(exitCode).toBe(1);
|
|
}, 10_000);
|
|
|
|
test("seq -inf does not hang", async () => {
|
|
await using proc = Bun.spawn({
|
|
cmd: [
|
|
bunExe(),
|
|
"-e",
|
|
`import { $ } from "bun"; $.throws(false); const r = await $\`seq -- -inf\`; process.exit(r.exitCode)`,
|
|
],
|
|
env: bunEnv,
|
|
stderr: "pipe",
|
|
});
|
|
|
|
const [stdout, stderr, exitCode] = await Promise.all([proc.stdout.text(), proc.stderr.text(), proc.exited]);
|
|
|
|
expect(stderr).toContain("invalid argument");
|
|
expect(exitCode).toBe(1);
|
|
}, 10_000);
|
|
|
|
test('[[ -d "" ]] does not crash', async () => {
|
|
await using proc = Bun.spawn({
|
|
cmd: [
|
|
bunExe(),
|
|
"-e",
|
|
`import { $ } from "bun"; $.throws(false); const r = await $\`[[ -d "" ]]\`; process.exit(r.exitCode)`,
|
|
],
|
|
env: bunEnv,
|
|
stderr: "pipe",
|
|
});
|
|
|
|
const [stdout, stderr, exitCode] = await Promise.all([proc.stdout.text(), proc.stderr.text(), proc.exited]);
|
|
|
|
expect(exitCode).toBe(1);
|
|
}, 10_000);
|
|
|
|
test('[[ -f "" ]] does not crash', async () => {
|
|
await using proc = Bun.spawn({
|
|
cmd: [
|
|
bunExe(),
|
|
"-e",
|
|
`import { $ } from "bun"; $.throws(false); const r = await $\`[[ -f "" ]]\`; process.exit(r.exitCode)`,
|
|
],
|
|
env: bunEnv,
|
|
stderr: "pipe",
|
|
});
|
|
|
|
const [stdout, stderr, exitCode] = await Promise.all([proc.stdout.text(), proc.stderr.text(), proc.exited]);
|
|
|
|
expect(exitCode).toBe(1);
|
|
}, 10_000);
|