From cc65eaf0a982066a8655632c04db11f7c0c5d0ad Mon Sep 17 00:00:00 2001 From: Misaki Kasumi Date: Sat, 28 Dec 2024 11:19:02 +0800 Subject: [PATCH 1/2] std.os.linux: remove app_mask --- lib/std/os/linux.zig | 1 - lib/std/posix.zig | 7 ------- 2 files changed, 8 deletions(-) diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 365fb9f05f..7b80bb2951 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -5113,7 +5113,6 @@ pub const NSIG = if (is_mips) 128 else 65; pub const sigset_t = [1024 / 32]u32; pub const all_mask: sigset_t = [_]u32{0xffffffff} ** @typeInfo(sigset_t).array.len; -pub const app_mask: sigset_t = [2]u32{ 0xfffffffc, 0x7fffffff } ++ [_]u32{0xffffffff} ** 30; const k_sigaction_funcs = struct { const handler = ?*align(1) const fn (i32) callconv(.c) void; diff --git a/lib/std/posix.zig b/lib/std/posix.zig index c9e67f7d38..12a71df6a5 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -720,16 +720,9 @@ pub fn raise(sig: u8) RaiseError!void { } if (native_os == .linux) { - var set: sigset_t = undefined; - // block application signals - sigprocmask(SIG.BLOCK, &linux.app_mask, &set); - const tid = linux.gettid(); const rc = linux.tkill(tid, sig); - // restore signal mask - sigprocmask(SIG.SETMASK, &set, null); - switch (errno(rc)) { .SUCCESS => return, else => |err| return unexpectedErrno(err), From aa832d6a6dbde8a0753d6aa59cc8199b009ea260 Mon Sep 17 00:00:00 2001 From: Misaki Kasumi Date: Wed, 2 Apr 2025 18:36:40 +0800 Subject: [PATCH 2/2] std.os.linux: block all signals in raise --- lib/std/posix.zig | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/std/posix.zig b/lib/std/posix.zig index 12a71df6a5..dc64f6b4bd 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -720,9 +720,19 @@ pub fn raise(sig: u8) RaiseError!void { } if (native_os == .linux) { + // https://git.musl-libc.org/cgit/musl/commit/?id=0bed7e0acfd34e3fb63ca0e4d99b7592571355a9 + // + // Unlike musl, libc-less Zig std does not have any internal signals for implementation purposes, so we + // need to block all signals on the assumption that any of them could potentially fork() in a handler. + var set: sigset_t = undefined; + sigprocmask(SIG.BLOCK, &linux.all_mask, &set); + const tid = linux.gettid(); const rc = linux.tkill(tid, sig); + // restore signal mask + sigprocmask(SIG.SETMASK, &set, null); + switch (errno(rc)) { .SUCCESS => return, else => |err| return unexpectedErrno(err),