aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bun.js/node/types.zig17
-rw-r--r--src/resolver/resolve_path.zig20
2 files changed, 33 insertions, 4 deletions
diff --git a/src/bun.js/node/types.zig b/src/bun.js/node/types.zig
index 72f1dff7e..7e9cdcd2d 100644
--- a/src/bun.js/node/types.zig
+++ b/src/bun.js/node/types.zig
@@ -2192,6 +2192,8 @@ pub const Path = struct {
if (comptime is_bindgen) return JSC.JSValue.jsUndefined();
if (args_len == 0) return JSC.ZigString.init("").toValue(globalThis);
var arena = @import("root").bun.ArenaAllocator.init(heap_allocator);
+ defer arena.deinit();
+
var arena_allocator = arena.allocator();
var stack_fallback_allocator = std.heap.stackFallback(
((32 * @sizeOf(string)) + 1024),
@@ -2199,18 +2201,27 @@ pub const Path = struct {
);
var allocator = stack_fallback_allocator.get();
- defer arena.deinit();
var buf: [bun.MAX_PATH_BYTES]u8 = undefined;
+ var count: usize = 0;
var to_join = allocator.alloc(string, args_len) catch unreachable;
for (args_ptr[0..args_len], 0..) |arg, i| {
const zig_str: JSC.ZigString = arg.getZigString(globalThis);
to_join[i] = zig_str.toSlice(allocator).slice();
+ count += to_join[i].len;
+ }
+
+ var buf_to_use: []u8 = &buf;
+ if (count * 2 >= buf.len) {
+ buf_to_use = allocator.alloc(u8, count * 2) catch {
+ globalThis.throwOutOfMemory();
+ return .zero;
+ };
}
const out = if (!isWindows)
- PathHandler.joinStringBuf(&buf, to_join, .posix)
+ PathHandler.joinStringBuf(buf_to_use, to_join, .posix)
else
- PathHandler.joinStringBuf(&buf, to_join, .windows);
+ PathHandler.joinStringBuf(buf_to_use, to_join, .windows);
var str = bun.String.create(out);
defer str.deref();
diff --git a/src/resolver/resolve_path.zig b/src/resolver/resolve_path.zig
index f74211709..381abc648 100644
--- a/src/resolver/resolve_path.zig
+++ b/src/resolver/resolve_path.zig
@@ -829,7 +829,25 @@ pub fn joinStringBuf(buf: []u8, _parts: anytype, comptime _platform: Platform) [
var written: usize = 0;
const platform = comptime _platform.resolve();
- var temp_buf: [4096]u8 = undefined;
+ var temp_buf_: [4096]u8 = undefined;
+ var temp_buf: []u8 = &temp_buf_;
+ var free_temp_buf = false;
+ defer {
+ if (free_temp_buf) {
+ bun.default_allocator.free(temp_buf);
+ }
+ }
+
+ var count: usize = 0;
+ for (_parts) |part| {
+ count += if (part.len > 0) part.len + 1 else 0;
+ }
+
+ if (count * 2 > temp_buf.len) {
+ temp_buf = bun.default_allocator.alloc(u8, count * 2) catch @panic("Out of memory");
+ free_temp_buf = true;
+ }
+
temp_buf[0] = 0;
for (_parts) |part| {