From 8fba47a7b415b4f299618418f1eda91e06aed93f Mon Sep 17 00:00:00 2001 From: robobun <117481402+robobun@users.noreply.github.com> Date: Mon, 11 May 2026 14:10:28 +0000 Subject: [PATCH] Fix capacity miscalculation in ESMConditions.init when allow_addons is true The expression `defaults.len + 2 + if (allow_addons) 1 else 0 + conditions.len` was parsed as `defaults.len + 2 + (if (allow_addons) 1 else (0 + conditions.len))`, dropping conditions.len from the reserved capacity when allow_addons was true (the default). With enough user-supplied conditions, putAssumeCapacity would overflow the map and crash. --- src/bundler/options.zig | 6 +++--- test/bundler/bun-build-api.test.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/bundler/options.zig b/src/bundler/options.zig index daea5ced59a3..bddfece6147a 100644 --- a/src/bundler/options.zig +++ b/src/bundler/options.zig @@ -1087,9 +1087,9 @@ pub const ESMConditions = struct { var require_condition_map = ConditionsMap.init(allocator); var style_condition_map = ConditionsMap.init(allocator); - try default_condition_amp.ensureTotalCapacity(defaults.len + 2 + if (allow_addons) 1 else 0 + conditions.len); - try import_condition_map.ensureTotalCapacity(defaults.len + 2 + if (allow_addons) 1 else 0 + conditions.len); - try require_condition_map.ensureTotalCapacity(defaults.len + 2 + if (allow_addons) 1 else 0 + conditions.len); + try default_condition_amp.ensureTotalCapacity(defaults.len + 2 + @as(usize, @intFromBool(allow_addons)) + conditions.len); + try import_condition_map.ensureTotalCapacity(defaults.len + 2 + @as(usize, @intFromBool(allow_addons)) + conditions.len); + try require_condition_map.ensureTotalCapacity(defaults.len + 2 + @as(usize, @intFromBool(allow_addons)) + conditions.len); try style_condition_map.ensureTotalCapacity(defaults.len + 2 + conditions.len); import_condition_map.putAssumeCapacity("import", {}); diff --git a/test/bundler/bun-build-api.test.ts b/test/bundler/bun-build-api.test.ts index c1112743f02c..f74ac1a86a48 100644 --- a/test/bundler/bun-build-api.test.ts +++ b/test/bundler/bun-build-api.test.ts @@ -70,6 +70,18 @@ describe("Bun.build", () => { throw new Error("should have thrown"); }); + test("many conditions does not crash", async () => { + const dir = tempDirWithFiles("bun-build-api-many-conditions", { + "index.js": `export default 1;`, + }); + const build = await Bun.build({ + entrypoints: [join(dir, "index.js")], + conditions: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p"], + }); + expect(build.success).toBe(true); + expect(build.outputs).toHaveLength(1); + }); + // https://github.com/oven-sh/bun/issues/12818 test("sourcemap + build error crash case", async () => { const dir = tempDirWithFiles("build", {