diff options
author | 2023-08-30 00:16:08 -0700 | |
---|---|---|
committer | 2023-08-30 00:16:08 -0700 | |
commit | e3dc5b6b4ce2c10d1e9c61fec2e86409e4ce48b0 (patch) | |
tree | acf51076ff9001863beb91555a595917f0dbdf18 /src/bun.js | |
parent | f2553d24543d72a777ba60213473332809866cb2 (diff) | |
download | bun-e3dc5b6b4ce2c10d1e9c61fec2e86409e4ce48b0.tar.gz bun-e3dc5b6b4ce2c10d1e9c61fec2e86409e4ce48b0.tar.zst bun-e3dc5b6b4ce2c10d1e9c61fec2e86409e4ce48b0.zip |
reset signal handlers in Bun.spawn (#4405)
* see if this fixes it
* We don't need this
* Remove extra flag
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'src/bun.js')
-rw-r--r-- | src/bun.js/api/bun/spawn.zig | 8 | ||||
-rw-r--r-- | src/bun.js/api/bun/subprocess.zig | 35 | ||||
-rw-r--r-- | src/bun.js/bindings/spawn.cpp | 18 |
3 files changed, 53 insertions, 8 deletions
diff --git a/src/bun.js/api/bun/spawn.zig b/src/bun.js/api/bun/spawn.zig index e5678ec44..8a8ec3fff 100644 --- a/src/bun.js/api/bun/spawn.zig +++ b/src/bun.js/api/bun/spawn.zig @@ -75,6 +75,14 @@ pub const PosixSpawn = struct { else => |err| return unexpectedErrno(err), } } + + pub fn resetSignals(this: *Attr) !void { + if (posix_spawnattr_reset_signals(&this.attr) != 0) { + return error.SystemResources; + } + } + + extern fn posix_spawnattr_reset_signals(attr: *system.posix_spawnattr_t) c_int; }; pub const Actions = struct { diff --git a/src/bun.js/api/bun/subprocess.zig b/src/bun.js/api/bun/subprocess.zig index 2ee94a222..c3244131d 100644 --- a/src/bun.js/api/bun/subprocess.zig +++ b/src/bun.js/api/bun/subprocess.zig @@ -1070,6 +1070,7 @@ pub const Subprocess = struct { var PATH = jsc_vm.bundler.env.get("PATH") orelse ""; var argv: std.ArrayListUnmanaged(?[*:0]const u8) = undefined; var cmd_value = JSValue.zero; + var detached: bool = false; var args = args_; { if (args.isEmptyOrUndefinedOrNull()) { @@ -1243,6 +1244,12 @@ pub const Subprocess = struct { } } } + + if (args.get(globalThis, "detached")) |detached_val| { + if (detached_val.isBoolean()) { + detached = detached_val.toBoolean(); + } + } } } @@ -1251,17 +1258,29 @@ pub const Subprocess = struct { return .zero; }; + var flags: i32 = bun.C.POSIX_SPAWN_SETSIGDEF | bun.C.POSIX_SPAWN_SETSIGMASK; + + if (comptime Environment.isMac) { + flags |= bun.C.POSIX_SPAWN_CLOEXEC_DEFAULT; + } + + if (detached) { + flags |= bun.C.POSIX_SPAWN_SETSID; + } + defer attr.deinit(); var actions = PosixSpawn.Actions.init() catch |err| return globalThis.handleError(err, "in posix_spawn"); if (comptime Environment.isMac) { - attr.set( - bun.C.POSIX_SPAWN_CLOEXEC_DEFAULT | bun.C.POSIX_SPAWN_SETSIGDEF | bun.C.POSIX_SPAWN_SETSIGMASK, - ) catch |err| return globalThis.handleError(err, "in posix_spawn"); + attr.set(@intCast(flags)) catch |err| return globalThis.handleError(err, "in posix_spawn"); } else if (comptime Environment.isLinux) { - attr.set( - bun.C.linux.POSIX_SPAWN.SETSIGDEF | bun.C.linux.POSIX_SPAWN.SETSIGMASK, - ) catch |err| return globalThis.handleError(err, "in posix_spawn"); + attr.set(@intCast(flags)) catch |err| return globalThis.handleError(err, "in posix_spawn"); } + + attr.resetSignals() catch { + globalThis.throw("Failed to reset signals in posix_spawn", .{}); + return .zero; + }; + defer actions.deinit(); if (!override_env and env_array.items.len == 0) { @@ -1344,14 +1363,14 @@ pub const Subprocess = struct { const kernel = @import("../../../analytics.zig").GenerateHeader.GeneratePlatform.kernelVersion(); // pidfd_nonblock only supported in 5.10+ - const flags: u32 = if (!is_sync and kernel.orderWithoutTag(.{ .major = 5, .minor = 10, .patch = 0 }).compare(.gte)) + const pidfd_flags: u32 = if (!is_sync and kernel.orderWithoutTag(.{ .major = 5, .minor = 10, .patch = 0 }).compare(.gte)) std.os.O.NONBLOCK else 0; const fd = std.os.linux.pidfd_open( pid, - flags, + pidfd_flags, ); switch (std.os.linux.getErrno(fd)) { diff --git a/src/bun.js/bindings/spawn.cpp b/src/bun.js/bindings/spawn.cpp new file mode 100644 index 000000000..531941f8a --- /dev/null +++ b/src/bun.js/bindings/spawn.cpp @@ -0,0 +1,18 @@ +#include <spawn.h> +#include <signal.h> + +extern "C" int posix_spawnattr_reset_signals(posix_spawnattr_t* attr) +{ + sigset_t signal_set; + sigfillset(&signal_set); + if (posix_spawnattr_setsigdefault(attr, &signal_set) != 0) { + return 1; + } + + sigemptyset(&signal_set); + if (posix_spawnattr_setsigmask(attr, &signal_set) != 0) { + return 1; + } + + return 0; +} |