diff options
-rw-r--r-- | src/bun.js/javascript.zig | 22 | ||||
-rw-r--r-- | src/fs.zig | 5 | ||||
-rw-r--r-- | test/js/bun/resolve/resolve.test.ts | 21 |
3 files changed, 45 insertions, 3 deletions
diff --git a/src/bun.js/javascript.zig b/src/bun.js/javascript.zig index e7ed3e0ab..3e5ac799d 100644 --- a/src/bun.js/javascript.zig +++ b/src/bun.js/javascript.zig @@ -1438,6 +1438,28 @@ pub const VirtualMachine = struct { is_esm: bool, comptime is_a_file_path: bool, ) void { + if (is_a_file_path and specifier.length() > comptime @as(u32, @intFromFloat(@trunc(@as(f64, @floatFromInt(bun.MAX_PATH_BYTES)) * 1.5)))) { + const specifier_utf8 = specifier.toUTF8(bun.default_allocator); + defer specifier_utf8.deinit(); + const source_utf8 = source.toUTF8(bun.default_allocator); + defer source_utf8.deinit(); + const printed = ResolveMessage.fmt( + bun.default_allocator, + specifier_utf8.slice(), + source_utf8.slice(), + error.NameTooLong, + ) catch @panic("Out of Memory"); + const msg = logger.Msg{ + .data = logger.rangeData( + null, + logger.Range.None, + printed, + ), + }; + res.* = ErrorableString.err(error.NameTooLong, ResolveMessage.create(global, VirtualMachine.get().allocator, msg, source.utf8()).asVoid()); + return; + } + var result = ResolveFunctionResult{ .path = "", .result = null }; var jsc_vm = VirtualMachine.get(); const specifier_utf8 = specifier.toUTF8(bun.default_allocator); diff --git a/src/fs.zig b/src/fs.zig index fd06006f5..51d3fb4b7 100644 --- a/src/fs.zig +++ b/src/fs.zig @@ -255,9 +255,8 @@ pub const FileSystem = struct { } pub fn get(entry: *const DirEntry, _query: string) ?Entry.Lookup { - if (_query.len == 0) return null; - var scratch_lookup_buffer: [256]u8 = undefined; - std.debug.assert(scratch_lookup_buffer.len >= _query.len); + if (_query.len == 0 or _query.len > bun.MAX_PATH_BYTES) return null; + var scratch_lookup_buffer: [bun.MAX_PATH_BYTES]u8 = undefined; const query = strings.copyLowercaseIfNeeded(_query, &scratch_lookup_buffer); const result = entry.data.get(query) orelse return null; diff --git a/test/js/bun/resolve/resolve.test.ts b/test/js/bun/resolve/resolve.test.ts index 1b66f711f..a9272fb3f 100644 --- a/test/js/bun/resolve/resolve.test.ts +++ b/test/js/bun/resolve/resolve.test.ts @@ -133,3 +133,24 @@ it("file url in require resolves", async () => { expect(exitCode).toBe(0); expect(stdout.toString("utf8")).toBe("1\n"); }); + +it("import long string should not segfault", async () => { + try { + await import("a".repeat(10000)); + } catch {} +}); +it("import long string should not segfault", async () => { + try { + import.meta.require("a".repeat(10000)); + } catch {} +}); +it("import long string should not segfault", async () => { + try { + await import.meta.resolve!("a".repeat(10000)); + } catch {} +}); +it("import long string should not segfault", async () => { + try { + await import.meta.require.resolve("a".repeat(10000)); + } catch {} +}); |