diff options
author | 2022-04-02 02:17:22 -0700 | |
---|---|---|
committer | 2022-04-02 02:17:22 -0700 | |
commit | 95d68b26a60ffb1065119c72cd681126a06fa9be (patch) | |
tree | 47305a02b304437129537be18c9c27030dce5827 | |
parent | db39c8e109c58e44fd7a15f88fb510680352eea8 (diff) | |
download | bun-95d68b26a60ffb1065119c72cd681126a06fa9be.tar.gz bun-95d68b26a60ffb1065119c72cd681126a06fa9be.tar.zst bun-95d68b26a60ffb1065119c72cd681126a06fa9be.zip |
Fix mmap on macOS x64
-rw-r--r-- | src/javascript/jsc/api/bun.zig | 24 | ||||
-rw-r--r-- | src/javascript/jsc/node/syscall.zig | 32 |
2 files changed, 27 insertions, 29 deletions
diff --git a/src/javascript/jsc/api/bun.zig b/src/javascript/jsc/api/bun.zig index d9c8aeee5..bd9fa54e6 100644 --- a/src/javascript/jsc/api/bun.zig +++ b/src/javascript/jsc/api/bun.zig @@ -1179,24 +1179,26 @@ pub fn mmapFile( var buf: [bun.MAX_PATH_BYTES]u8 = undefined; const path = getFilePath(ctx, arguments[0..@minimum(1, arguments.len)], &buf, exception) orelse return null; + args.eat(); buf[path.len] = 0; const buf_z: [:0]const u8 = buf[0..path.len :0]; - const flags = v: { - _ = args.nextEat(); - const opts = args.nextEat() orelse break :v std.os.MAP.SHARED; - const sync = opts.get(ctx.ptr(), "sync") orelse JSC.JSValue.jsBoolean(false); - const shared = opts.get(ctx.ptr(), "shared") orelse JSC.JSValue.jsBoolean(true); - const sync_flags = if (@hasDecl(std.os, "SYNC")) std.os.MAP.SYNC | std.os.MAP.SHARED_VALIDATE else 0; + const sync_flags: u32 = if (@hasDecl(std.os.MAP, "SYNC")) std.os.MAP.SYNC | std.os.MAP.SHARED_VALIDATE else 0; + const file_flags: u32 = if (@hasDecl(std.os.MAP, "FILE")) std.os.MAP.FILE else 0; - var flags: u32 = 0; - if (sync.toBoolean()) flags |= sync_flags; - if (shared.toBoolean()) flags |= std.os.MAP.SHARED else flags |= std.os.MAP.PRIVATE; + // Conforming applications must specify either MAP_PRIVATE or MAP_SHARED. + var flags = file_flags; - break :v flags; - }; + if (args.nextEat()) |opts| { + const sync = opts.get(ctx.ptr(), "sync") orelse JSC.JSValue.jsBoolean(false); + const shared = opts.get(ctx.ptr(), "shared") orelse JSC.JSValue.jsBoolean(true); + flags |= @as(u32, if (sync.toBoolean()) sync_flags else 0); + flags |= @as(u32, if (shared.toBoolean()) std.os.MAP.SHARED else std.os.MAP.PRIVATE); + } else { + flags |= std.os.MAP.SHARED; + } const map = switch (JSC.Node.Syscall.mmapFile(buf_z, flags)) { .result => |map| map, diff --git a/src/javascript/jsc/node/syscall.zig b/src/javascript/jsc/node/syscall.zig index bf4d6189e..736e5b809 100644 --- a/src/javascript/jsc/node/syscall.zig +++ b/src/javascript/jsc/node/syscall.zig @@ -104,19 +104,19 @@ pub fn chdir(destination: [:0]const u8) Maybe(void) { } pub fn stat(path: [:0]const u8) Maybe(os.Stat) { - var stat_ = comptime mem.zeroes(os.Stat); + var stat_ = mem.zeroes(os.Stat); if (Maybe(os.Stat).errnoSys(sys.stat(path, &stat_), .stat)) |err| return err; return Maybe(os.Stat){ .result = stat_ }; } pub fn lstat(path: [:0]const u8) Maybe(os.Stat) { - var stat_ = comptime mem.zeroes(os.Stat); + var stat_ = mem.zeroes(os.Stat); if (Maybe(os.Stat).errnoSys(C.lstat(path, &stat_), .lstat)) |err| return err; return Maybe(os.Stat){ .result = stat_ }; } pub fn fstat(fd: JSC.Node.FileDescriptor) Maybe(os.Stat) { - var stat_ = comptime mem.zeroes(os.Stat); + var stat_ = mem.zeroes(os.Stat); if (Maybe(os.Stat).errnoSys(fstat_sym(fd, &stat_), .fstat)) |err| return err; return Maybe(os.Stat){ .result = stat_ }; } @@ -404,7 +404,7 @@ pub fn getFdPath(fd: fd_t, out_buffer: *[MAX_PATH_BYTES]u8) Maybe([]u8) { /// Use of a mapped region can result in these signals: /// * SIGSEGV - Attempted write into a region mapped as read-only. /// * SIGBUS - Attempted access to a portion of the buffer that does not correspond to the file -fn sysmmap( +fn mmap( ptr: ?[*]align(mem.page_size) u8, length: usize, prot: u32, @@ -416,20 +416,16 @@ fn sysmmap( system.mmap64 else system.mmap; - const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned const rc = mmap_sym(ptr, length, prot, flags, fd, ioffset); - _ = if (builtin.link_libc) blk: { - if (rc != std.c.MAP.FAILED) return .{ .result = @ptrCast([*]align(mem.page_size) u8, @alignCast(mem.page_size, rc))[0..length] }; - break :blk rc; - } else blk: { - const err = os.errno(rc); - if (err == .SUCCESS) return .{ .result = @intToPtr([*]align(mem.page_size) u8, rc)[0..length] }; - break :blk rc; - }; - - return Maybe([]align(mem.page_size) u8).errnoSys(@ptrToInt(rc), .mmap).?; + if (rc == std.c.MAP.FAILED) { + return Maybe([]align(mem.page_size) u8){ + .err = .{ .errno = @truncate(Syscall.Error.Int, @enumToInt(std.c.getErrno(@bitCast(i64, @ptrToInt(std.c.MAP.FAILED))))), .syscall = .mmap }, + }; + } + + return Maybe([]align(mem.page_size) u8){.result = @ptrCast([*]align(mem.page_size) u8, @alignCast(mem.page_size, rc))[0..length] }; } pub fn mmapFile(path: [:0]const u8, flags: u32) Maybe([]align(mem.page_size) u8) { @@ -438,15 +434,15 @@ pub fn mmapFile(path: [:0]const u8, flags: u32) Maybe([]align(mem.page_size) u8) .err => |err| return .{ .err = err }, }; - const size = switch (stat(path)) { - .result => |stat| stat.size, + const size = switch (fstat(fd)) { + .result => |result| result.size, .err => |err| { _ = close(fd); return .{ .err = err }; }, }; - const map = switch (sysmmap(null, @intCast(usize, size), os.PROT.READ | os.PROT.WRITE, flags, fd, 0)) { + const map = switch (mmap(null, @intCast(usize, size), os.PROT.READ | os.PROT.WRITE, flags, fd, 0)) { .result => |map| map, .err => |err| { |