Skip to content

Commit 1667a95

Browse files
committed
Merge pull request #14752 from JuliaLang/yyc/stkovf-aarch64
Handle SIGBUS with the SegFault handler
2 parents 61bd788 + 770ab8f commit 1667a95

File tree

1 file changed

+10
-9
lines changed

1 file changed

+10
-9
lines changed

src/signals-unix.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,26 +88,26 @@ static void jl_unblock_signal(int sig)
8888

8989
static void segv_handler(int sig, siginfo_t *info, void *context)
9090
{
91-
assert(sig == SIGSEGV);
91+
assert(sig == SIGSEGV || sig == SIGBUS);
9292

9393
#ifdef JULIA_ENABLE_THREADING
9494
if (info->si_addr == jl_gc_signal_page) {
95-
jl_unblock_signal(SIGSEGV);
95+
jl_unblock_signal(sig);
9696
jl_gc_signal_wait();
9797
return;
9898
}
9999
#endif
100100
if (jl_in_jl_ || is_addr_on_stack(jl_get_ptls_states(), info->si_addr)) { // stack overflow, or restarting jl_
101-
jl_unblock_signal(SIGSEGV);
101+
jl_unblock_signal(sig);
102102
jl_throw(jl_stackovf_exception);
103103
}
104-
else if (info->si_code == SEGV_ACCERR) { // writing to read-only memory (e.g., mmap)
105-
jl_unblock_signal(SIGSEGV);
104+
else if (sig == SIGSEGV && info->si_code == SEGV_ACCERR) { // writing to read-only memory (e.g., mmap)
105+
jl_unblock_signal(sig);
106106
jl_throw(jl_readonlymemory_exception);
107107
}
108108
else {
109109
#ifdef SEGV_EXCEPTION
110-
jl_unblock_signal(SIGSEGV);
110+
jl_unblock_signal(sig);
111111
jl_throw(jl_segv_exception);
112112
#else
113113
sigdie_handler(sig, info, context);
@@ -125,6 +125,10 @@ static void allocate_segv_handler(void)
125125
if (sigaction(SIGSEGV, &act, NULL) < 0) {
126126
jl_errorf("fatal error: sigaction: %s", strerror(errno));
127127
}
128+
// On AArch64, stack overflow triggers a SIGBUS
129+
if (sigaction(SIGBUS, &act, NULL) < 0) {
130+
jl_errorf("fatal error: sigaction: %s", strerror(errno));
131+
}
128132
}
129133

130134
static unw_context_t *volatile signal_context;
@@ -506,9 +510,6 @@ void jl_install_default_signal_handlers(void)
506510
sigemptyset(&act_die.sa_mask);
507511
act_die.sa_sigaction = sigdie_handler;
508512
act_die.sa_flags = SA_SIGINFO;
509-
if (sigaction(SIGBUS, &act_die, NULL) < 0) {
510-
jl_errorf("fatal error: sigaction: %s", strerror(errno));
511-
}
512513
if (sigaction(SIGILL, &act_die, NULL) < 0) {
513514
jl_errorf("fatal error: sigaction: %s", strerror(errno));
514515
}

0 commit comments

Comments
 (0)