Skip to content

Instantly share code, notes, and snippets.

@matu3ba
Last active February 15, 2023 22:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matu3ba/c5f3b2995095705a6eec0584484155d6 to your computer and use it in GitHub Desktop.
Save matu3ba/c5f3b2995095705a6eec0584484155d6 to your computer and use it in GitHub Desktop.
Breaking Zigs default panic handler
Segmentation fault at address 0x3e800033cc6
/home/user/dev/git/zi/zig/master/build/stage3/lib/zig/std/os/linux/x86_64.zig:36:5: 0x22d97c in syscall2
(stacking_panics)
return asm volatile ("syscall"
^
/home/user/dev/git/zi/zig/master/build/stage3/lib/zig/std/os/linux.zig:991:49: 0x20f19f in nanosleep (sta
cking_panics)
return syscall2(.nanosleep, @ptrToInt(req), @ptrToInt(rem));
^
/home/user/dev/git/zi/zig/master/build/stage3/lib/zig/std/os.zig:5253:39: 0x20b681 in nanosleep (stacking
_panics)
switch (errno(system.nanosleep(&req, &rem))) {
^
/home/user/dev/git/tryzig/stacking_panics.zig:19:25: 0x20b3b4 in t1Exec (stacking_panics)
std.os.nanosleep(0, 1_000);
^
/home/user/dev/git/tryzig/stacking_panics.zig:10:15: 0x20b720 in main (stacking_panics)
try t1Exec();
^
/home/user/dev/git/zi/zig/master/build/stage3/lib/zig/std/start.zig:616:37: 0x20ad89 in posixCallMainAndE
xit (stacking_panics)
const result = root.main() catch |err| {
^
/home/user/dev/git/zi/zig/master/build/stage3/lib/zig/std/start.zig:376:5: 0x20a7f1 in _start (stacking_p
anics)
@call(.never_inline, posixCallMainAndExit, .{});
^
Abgebrochen (Speicherabzug geschrieben)
raised 2526 signals
raised 2527 signals
raised 2528 signals
raised 2529 signals
raised 2530 signals
raised 2531 signals
raised 2532 signals
raised 2533 signals
raised 2534 signals
raised 2535 signals
raised 2536 signals
raised 2537 signals
raised 2538 signals
raised 2539 signals
raised 2540 signals
raised 2541 signals
raised 2542 signals
raised 2543 signals
raised 2544 signals
raised 2545 signals
raised 2546 signals
raised 2547 signals
raised 2548 signals
raised 2549 signals
raised 2550 signals
raised 2551 signals
raised 2552 signals
raised 2553 signals
raised 2554 signals
raised 2555 signals
raised 2556 signals
raised 2557 signals
raised 2558 signals
raised 2559 signals
raised /home/misterspoon/dev/git/zi/zig/master/build/stage3/lib/zig/std/start.zig2560: signals
376:raised 52561 signals
: raised 25620x signals
20a8e1raised in 2563_start signals
(stacking_panicsraised )2564 signals
raised 2565 signals
raised 2566 signals
raised 2567 signals
raised 2568 signals
raised 2569 signals
raised 2570 signals
raised 2571 signals
raised 2572 signals
raised 2573 signals
raised 2574 signals
raised 2575 signals
raised 2576 signals
raised 2577 signals
raised 2578 signals
raised 2579 signals
raised 2580 signals
raised 2581 signals
raised 2582 signals
raised 2583 signals
@craised a2584l signals
l(raised .2585n signals
eraised v2586e signals
r_raised i2587n signals
liraised n2588e signals
, raised p2589o signals
siraised x2590C signals
alraised l2591M signals
airaised n2592A signals
ndraised E2593x signals
iraised t2594, signals
.raised {2595} signals
);raised
2596 signals
raised ^2597
signals
raised 2598 signals
raised 2599 signals
raised Abgebrochen (Speicherabzug geschrieben)
//! Stacking panics example to break Zig panic handler.
//! principle threads t1, t2
//! - t1 tells t2 its pid
//! - t1 waits blocking + sleeping
//! - t2 signals continuously t1 leading to panic during panic situation
const std = @import("std");
pub fn main() !void {
try t1Exec();
}
fn t1Exec() !void {
const pid_t1: std.os.pid_t = @intCast(i32, std.Thread.getCurrentId());
const t2 = try std.Thread.spawn(.{}, t2Exec, .{pid_t1});
t2.detach();
// busy sleeping
while (true) {
std.os.nanosleep(0, 1_000);
}
}
fn t2Exec(pid_t1: std.os.pid_t) void {
// content 1
// const res = std.os.linux.tgkill(pid_t1, pid_t1, std.os.SIG.SEGV);
// std.debug.assert(res == 0);
// content 2
var cnt: u64 = 0;
while (true) {
// t1 is group leader = "master thread"
const res = std.os.linux.tgkill(pid_t1, pid_t1, std.os.SIG.SEGV);
std.debug.print("raised {d} signals\n", .{cnt});
std.debug.assert(res == 0);
// std.os.nanosleep(0, 1_000);
cnt += 1;
}
}
// zig build-exe stacking-panics.zig && stacking-panics
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment