aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-08-30 00:16:08 -0700
committerGravatar GitHub <noreply@github.com> 2023-08-30 00:16:08 -0700
commite3dc5b6b4ce2c10d1e9c61fec2e86409e4ce48b0 (patch)
treeacf51076ff9001863beb91555a595917f0dbdf18 /src/bun.js
parentf2553d24543d72a777ba60213473332809866cb2 (diff)
downloadbun-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.zig8
-rw-r--r--src/bun.js/api/bun/subprocess.zig35
-rw-r--r--src/bun.js/bindings/spawn.cpp18
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;
+}