aboutsummaryrefslogtreecommitdiff
path: root/src/libmain/stack.cc
diff options
context:
space:
mode:
authorThéophane Hufschmitt <theophane.hufschmitt@tweag.io>2022-11-14 15:00:05 +0100
committerThéophane Hufschmitt <theophane.hufschmitt@tweag.io>2022-11-14 15:00:05 +0100
commit8b4352d79b488a82321254b7ab531ff977816361 (patch)
tree50e0dfb0d22b82d49b82aac0cd7b80f5482deada /src/libmain/stack.cc
parente7ed9ae0c711c4efd83756b16379549ecff52355 (diff)
parent302ddee749f1341895b3f18c7f430dfc13171985 (diff)
Merge remote-tracking branch 'nixos/master' into readFile-scan-references
Diffstat (limited to 'src/libmain/stack.cc')
-rw-r--r--src/libmain/stack.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/libmain/stack.cc b/src/libmain/stack.cc
index b0a4a4c5d..10f71c1dc 100644
--- a/src/libmain/stack.cc
+++ b/src/libmain/stack.cc
@@ -1,4 +1,5 @@
#include "error.hh"
+#include "shared.hh"
#include <cstring>
#include <cstddef>
@@ -29,9 +30,7 @@ static void sigsegvHandler(int signo, siginfo_t * info, void * ctx)
ptrdiff_t diff = (char *) info->si_addr - sp;
if (diff < 0) diff = -diff;
if (diff < 4096) {
- char msg[] = "error: stack overflow (possible infinite recursion)\n";
- [[gnu::unused]] auto res = write(2, msg, strlen(msg));
- _exit(1); // maybe abort instead?
+ nix::stackOverflowHandler(info, ctx);
}
}
@@ -67,5 +66,12 @@ void detectStackOverflow()
#endif
}
+std::function<void(siginfo_t * info, void * ctx)> stackOverflowHandler(defaultStackOverflowHandler);
+
+void defaultStackOverflowHandler(siginfo_t * info, void * ctx) {
+ char msg[] = "error: stack overflow (possible infinite recursion)\n";
+ [[gnu::unused]] auto res = write(2, msg, strlen(msg));
+ _exit(1); // maybe abort instead?
+}
}