authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-09 17:36:40+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-11-09 17:36:40+02:00
log41b7e40d75bdd415da0daef6fa6a71dc4686320f
tree192a10d212127c63c8c1bf8f71b7103545f0f2e3
parentd1e7be0bd190e1d93a6375b051a180f739990191
parenta68b27c252669f3a42b8f789359893ee82cd0aad
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #13418 from ryanschneider/signal-alignment-13216

std.os: fix alignment of Sigaction.handler_fn

9 files changed, 38 insertions(+), 15 deletions(-)

lib/std/c/darwin.zig+1-1
......@@ -918,7 +918,7 @@ pub const siginfo_t = extern struct {
918918
919919/// Renamed from `sigaction` to `Sigaction` to avoid conflict with function name.
920920pub const Sigaction = extern struct {
921 pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
921 pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
922922 pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
923923
924924 handler: extern union {
lib/std/c/dragonfly.zig+1-1
......@@ -681,7 +681,7 @@ pub const empty_sigset = sigset_t{ .__bits = [_]c_uint{0} ** _SIG_WORDS };
681681pub const sig_atomic_t = c_int;
682682
683683pub const Sigaction = extern struct {
684 pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
684 pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
685685 pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
686686
687687 /// signal handler
lib/std/c/freebsd.zig+1-1
......@@ -1197,7 +1197,7 @@ const NSIG = 32;
11971197
11981198/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
11991199pub const Sigaction = extern struct {
1200 pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
1200 pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
12011201 pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
12021202
12031203 /// signal handler
lib/std/c/haiku.zig+1-1
......@@ -742,7 +742,7 @@ const NSIG = 32;
742742
743743/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
744744pub const Sigaction = extern struct {
745 pub const handler_fn = std.meta.FnPtr(fn (i32) callconv(.C) void);
745 pub const handler_fn = std.meta.FnPtr(fn (i32) align(1) callconv(.C) void);
746746
747747 /// signal handler
748748 __sigaction_u: extern union {
lib/std/c/netbsd.zig+1-1
......@@ -971,7 +971,7 @@ pub const SIG = struct {
971971
972972/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
973973pub const Sigaction = extern struct {
974 pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
974 pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
975975 pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
976976
977977 /// signal handler
lib/std/c/openbsd.zig+1-1
......@@ -1026,7 +1026,7 @@ pub const SIG = struct {
10261026
10271027/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
10281028pub const Sigaction = extern struct {
1029 pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
1029 pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
10301030 pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
10311031
10321032 /// signal handler
lib/std/c/solaris.zig+1-1
......@@ -952,7 +952,7 @@ pub const SIG = struct {
952952
953953/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
954954pub const Sigaction = extern struct {
955 pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
955 pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
956956 pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
957957
958958 /// signal options
lib/std/os/linux.zig+2-2
......@@ -3130,7 +3130,7 @@ pub const all_mask: sigset_t = [_]u32{0xffffffff} ** @typeInfo(sigset_t).Array.l
31303130pub const app_mask: sigset_t = [2]u32{ 0xfffffffc, 0x7fffffff } ++ [_]u32{0xffffffff} ** 30;
31313131
31323132const k_sigaction_funcs = struct {
3133 const handler = ?std.meta.FnPtr(fn (c_int) callconv(.C) void);
3133 const handler = ?std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
31343134 const restorer = std.meta.FnPtr(fn () callconv(.C) void);
31353135};
31363136
......@@ -3157,7 +3157,7 @@ pub const k_sigaction = switch (native_arch) {
31573157
31583158/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
31593159pub const Sigaction = extern struct {
3160 pub const handler_fn = std.meta.FnPtr(fn (c_int) callconv(.C) void);
3160 pub const handler_fn = std.meta.FnPtr(fn (c_int) align(1) callconv(.C) void);
31613161 pub const sigaction_fn = std.meta.FnPtr(fn (c_int, *const siginfo_t, ?*const anyopaque) callconv(.C) void);
31623162
31633163 handler: extern union {
lib/std/os/test.zig+29-6
......@@ -739,8 +739,6 @@ test "shutdown socket" {
739739 os.closeSocket(sock);
740740}
741741
742var signal_test_failed = true;
743
744742test "sigaction" {
745743 if (native_os == .wasi or native_os == .windows)
746744 return error.SkipZigTest;
......@@ -750,17 +748,19 @@ test "sigaction" {
750748 return error.SkipZigTest;
751749
752750 const S = struct {
751 var handler_called_count: u32 = 0;
752
753753 fn handler(sig: i32, info: *const os.siginfo_t, ctx_ptr: ?*const anyopaque) callconv(.C) void {
754754 _ = ctx_ptr;
755755 // Check that we received the correct signal.
756756 switch (native_os) {
757757 .netbsd => {
758758 if (sig == os.SIG.USR1 and sig == info.info.signo)
759 signal_test_failed = false;
759 handler_called_count += 1;
760760 },
761761 else => {
762762 if (sig == os.SIG.USR1 and sig == info.signo)
763 signal_test_failed = false;
763 handler_called_count += 1;
764764 },
765765 }
766766 }
......@@ -774,18 +774,41 @@ test "sigaction" {
774774 .flags = os.SA.SIGINFO | os.SA.RESETHAND,
775775 };
776776 var old_sa: os.Sigaction = undefined;
777
777778 // Install the new signal handler.
778779 try os.sigaction(os.SIG.USR1, &sa, null);
780
779781 // Check that we can read it back correctly.
780782 try os.sigaction(os.SIG.USR1, null, &old_sa);
781783 try testing.expectEqual(actual_handler, old_sa.handler.sigaction.?);
782784 try testing.expect((old_sa.flags & os.SA.SIGINFO) != 0);
785
783786 // Invoke the handler.
784787 try os.raise(os.SIG.USR1);
785 try testing.expect(signal_test_failed == false);
786 // Check if the handler has been correctly reset to SIG_DFL
788 try testing.expect(S.handler_called_count == 1);
789
790 // Check if passing RESETHAND correctly reset the handler to SIG_DFL
787791 try os.sigaction(os.SIG.USR1, null, &old_sa);
788792 try testing.expectEqual(os.SIG.DFL, old_sa.handler.handler);
793
794 // Reinstall the signal w/o RESETHAND and re-raise
795 sa.flags = os.SA.SIGINFO;
796 try os.sigaction(os.SIG.USR1, &sa, null);
797 try os.raise(os.SIG.USR1);
798 try testing.expect(S.handler_called_count == 2);
799
800 // Now set the signal to ignored
801 sa.handler = .{ .handler = os.SIG.IGN };
802 sa.flags = 0;
803 try os.sigaction(os.SIG.USR1, &sa, null);
804
805 // Re-raise to ensure handler is actually ignored
806 try os.raise(os.SIG.USR1);
807 try testing.expect(S.handler_called_count == 2);
808
809 // Ensure that ignored state is returned when querying
810 try os.sigaction(os.SIG.USR1, null, &old_sa);
811 try testing.expectEqual(os.SIG.IGN, old_sa.handler.handler.?);
789812}
790813
791814test "dup & dup2" {