mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-09 23:29:03 +00:00
Merge pull request #13418 from ryanschneider/signal-alignment-13216
std.os: fix alignment of Sigaction.handler_fn
This commit is contained in:
parent
11c1ddfc97
commit
95ecd521b8
9 changed files with 38 additions and 15 deletions
|
|
@ -918,7 +918,7 @@ pub const siginfo_t = extern struct {
|
||||||
|
|
||||||
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with function name.
|
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with function name.
|
||||||
pub const Sigaction = extern struct {
|
pub const Sigaction = extern struct {
|
||||||
pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
|
pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
|
||||||
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
||||||
|
|
||||||
handler: extern union {
|
handler: extern union {
|
||||||
|
|
|
||||||
|
|
@ -681,7 +681,7 @@ pub const empty_sigset = sigset_t{ .__bits = [_]c_uint{0} ** _SIG_WORDS };
|
||||||
pub const sig_atomic_t = c_int;
|
pub const sig_atomic_t = c_int;
|
||||||
|
|
||||||
pub const Sigaction = extern struct {
|
pub const Sigaction = extern struct {
|
||||||
pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
|
pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
|
||||||
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
||||||
|
|
||||||
/// signal handler
|
/// signal handler
|
||||||
|
|
|
||||||
|
|
@ -1197,7 +1197,7 @@ const NSIG = 32;
|
||||||
|
|
||||||
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
||||||
pub const Sigaction = extern struct {
|
pub const Sigaction = extern struct {
|
||||||
pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
|
pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
|
||||||
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
||||||
|
|
||||||
/// signal handler
|
/// signal handler
|
||||||
|
|
|
||||||
|
|
@ -742,7 +742,7 @@ const NSIG = 32;
|
||||||
|
|
||||||
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
||||||
pub const Sigaction = extern struct {
|
pub const Sigaction = extern struct {
|
||||||
pub const handler_fn = std.meta.FnPtr(fn (i32) callconv(.C) void);
|
pub const handler_fn = std.meta.FnPtr(fn (i32) align(1) callconv(.C) void);
|
||||||
|
|
||||||
/// signal handler
|
/// signal handler
|
||||||
__sigaction_u: extern union {
|
__sigaction_u: extern union {
|
||||||
|
|
|
||||||
|
|
@ -971,7 +971,7 @@ pub const SIG = struct {
|
||||||
|
|
||||||
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
||||||
pub const Sigaction = extern struct {
|
pub const Sigaction = extern struct {
|
||||||
pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
|
pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
|
||||||
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
||||||
|
|
||||||
/// signal handler
|
/// signal handler
|
||||||
|
|
|
||||||
|
|
@ -1026,7 +1026,7 @@ pub const SIG = struct {
|
||||||
|
|
||||||
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
||||||
pub const Sigaction = extern struct {
|
pub const Sigaction = extern struct {
|
||||||
pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
|
pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
|
||||||
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
||||||
|
|
||||||
/// signal handler
|
/// signal handler
|
||||||
|
|
|
||||||
|
|
@ -952,7 +952,7 @@ pub const SIG = struct {
|
||||||
|
|
||||||
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
||||||
pub const Sigaction = extern struct {
|
pub const Sigaction = extern struct {
|
||||||
pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
|
pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
|
||||||
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
||||||
|
|
||||||
/// signal options
|
/// signal options
|
||||||
|
|
|
||||||
|
|
@ -3130,7 +3130,7 @@ pub const all_mask: sigset_t = [_]u32{0xffffffff} ** @typeInfo(sigset_t).Array.l
|
||||||
pub const app_mask: sigset_t = [2]u32{ 0xfffffffc, 0x7fffffff } ++ [_]u32{0xffffffff} ** 30;
|
pub const app_mask: sigset_t = [2]u32{ 0xfffffffc, 0x7fffffff } ++ [_]u32{0xffffffff} ** 30;
|
||||||
|
|
||||||
const k_sigaction_funcs = struct {
|
const k_sigaction_funcs = struct {
|
||||||
const handler = ?std.meta.FnPtr(fn (c_int) callconv(.C) void);
|
const handler = ?std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
|
||||||
const restorer = std.meta.FnPtr(fn () callconv(.C) void);
|
const restorer = std.meta.FnPtr(fn () callconv(.C) void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -3157,7 +3157,7 @@ pub const k_sigaction = switch (native_arch) {
|
||||||
|
|
||||||
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
|
||||||
pub const Sigaction = extern struct {
|
pub const Sigaction = extern struct {
|
||||||
pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
|
pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
|
||||||
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
|
||||||
|
|
||||||
handler: extern union {
|
handler: extern union {
|
||||||
|
|
|
||||||
|
|
@ -739,8 +739,6 @@ test "shutdown socket" {
|
||||||
os.closeSocket(sock);
|
os.closeSocket(sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
var signal_test_failed = true;
|
|
||||||
|
|
||||||
test "sigaction" {
|
test "sigaction" {
|
||||||
if (native_os == .wasi or native_os == .windows)
|
if (native_os == .wasi or native_os == .windows)
|
||||||
return error.SkipZigTest;
|
return error.SkipZigTest;
|
||||||
|
|
@ -750,17 +748,19 @@ test "sigaction" {
|
||||||
return error.SkipZigTest;
|
return error.SkipZigTest;
|
||||||
|
|
||||||
const S = struct {
|
const S = struct {
|
||||||
|
var handler_called_count: u32 = 0;
|
||||||
|
|
||||||
fn handler(sig: i32, info: *const os.siginfo_t, ctx_ptr: ?*const anyopaque) callconv(.C) void {
|
fn handler(sig: i32, info: *const os.siginfo_t, ctx_ptr: ?*const anyopaque) callconv(.C) void {
|
||||||
_ = ctx_ptr;
|
_ = ctx_ptr;
|
||||||
// Check that we received the correct signal.
|
// Check that we received the correct signal.
|
||||||
switch (native_os) {
|
switch (native_os) {
|
||||||
.netbsd => {
|
.netbsd => {
|
||||||
if (sig == os.SIG.USR1 and sig == info.info.signo)
|
if (sig == os.SIG.USR1 and sig == info.info.signo)
|
||||||
signal_test_failed = false;
|
handler_called_count += 1;
|
||||||
},
|
},
|
||||||
else => {
|
else => {
|
||||||
if (sig == os.SIG.USR1 and sig == info.signo)
|
if (sig == os.SIG.USR1 and sig == info.signo)
|
||||||
signal_test_failed = false;
|
handler_called_count += 1;
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -774,18 +774,41 @@ test "sigaction" {
|
||||||
.flags = os.SA.SIGINFO | os.SA.RESETHAND,
|
.flags = os.SA.SIGINFO | os.SA.RESETHAND,
|
||||||
};
|
};
|
||||||
var old_sa: os.Sigaction = undefined;
|
var old_sa: os.Sigaction = undefined;
|
||||||
|
|
||||||
// Install the new signal handler.
|
// Install the new signal handler.
|
||||||
try os.sigaction(os.SIG.USR1, &sa, null);
|
try os.sigaction(os.SIG.USR1, &sa, null);
|
||||||
|
|
||||||
// Check that we can read it back correctly.
|
// Check that we can read it back correctly.
|
||||||
try os.sigaction(os.SIG.USR1, null, &old_sa);
|
try os.sigaction(os.SIG.USR1, null, &old_sa);
|
||||||
try testing.expectEqual(actual_handler, old_sa.handler.sigaction.?);
|
try testing.expectEqual(actual_handler, old_sa.handler.sigaction.?);
|
||||||
try testing.expect((old_sa.flags & os.SA.SIGINFO) != 0);
|
try testing.expect((old_sa.flags & os.SA.SIGINFO) != 0);
|
||||||
|
|
||||||
// Invoke the handler.
|
// Invoke the handler.
|
||||||
try os.raise(os.SIG.USR1);
|
try os.raise(os.SIG.USR1);
|
||||||
try testing.expect(signal_test_failed == false);
|
try testing.expect(S.handler_called_count == 1);
|
||||||
// Check if the handler has been correctly reset to SIG_DFL
|
|
||||||
|
// Check if passing RESETHAND correctly reset the handler to SIG_DFL
|
||||||
try os.sigaction(os.SIG.USR1, null, &old_sa);
|
try os.sigaction(os.SIG.USR1, null, &old_sa);
|
||||||
try testing.expectEqual(os.SIG.DFL, old_sa.handler.handler);
|
try testing.expectEqual(os.SIG.DFL, old_sa.handler.handler);
|
||||||
|
|
||||||
|
// Reinstall the signal w/o RESETHAND and re-raise
|
||||||
|
sa.flags = os.SA.SIGINFO;
|
||||||
|
try os.sigaction(os.SIG.USR1, &sa, null);
|
||||||
|
try os.raise(os.SIG.USR1);
|
||||||
|
try testing.expect(S.handler_called_count == 2);
|
||||||
|
|
||||||
|
// Now set the signal to ignored
|
||||||
|
sa.handler = .{ .handler = os.SIG.IGN };
|
||||||
|
sa.flags = 0;
|
||||||
|
try os.sigaction(os.SIG.USR1, &sa, null);
|
||||||
|
|
||||||
|
// Re-raise to ensure handler is actually ignored
|
||||||
|
try os.raise(os.SIG.USR1);
|
||||||
|
try testing.expect(S.handler_called_count == 2);
|
||||||
|
|
||||||
|
// Ensure that ignored state is returned when querying
|
||||||
|
try os.sigaction(os.SIG.USR1, null, &old_sa);
|
||||||
|
try testing.expectEqual(os.SIG.IGN, old_sa.handler.handler.?);
|
||||||
}
|
}
|
||||||
|
|
||||||
test "dup & dup2" {
|
test "dup & dup2" {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue