From 0d756757877ecfb09fd2003cf887dfdf8067b702 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Fri, 14 Oct 2022 12:25:41 +0200 Subject: libmain: Add extraStackOverflowHandler --- src/libmain/shared.hh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/libmain/shared.hh') diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh index 0cc56d47d..66d29a1f7 100644 --- a/src/libmain/shared.hh +++ b/src/libmain/shared.hh @@ -113,5 +113,24 @@ struct PrintFreed /* Install a SIGSEGV handler to detect stack overflows. */ void detectStackOverflow(); +/* Pluggable behavior to run before _exit(1) in case of a stack overflow. + + Default value: do nothing, return immediately. + + This is called by the handler installed by detectStackOverflow(). + + This gives Nix library consumers a limit opportunity to report the error + condition. + + NOTE: Use with diligence, because this runs in the signal handler, with very + limited stack space and a potentially a corrupted heap, all while the failed + thread is blocked indefinitely. All functions called must be reentrant. */ +extern std::function stackOverflowHandler; + +/* The default, robust implementation of stackOverflowHandler. + + Prints an error message directly to stderr using a syscall instead of the + logger. Exits the process immediately after. */ +void defaultStackOverflowHandler(siginfo_t * info, void * ctx); } -- cgit v1.2.3 From ab4eb39386eab091f8682efa69e104f4ed74c1ca Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Fri, 14 Oct 2022 12:37:34 +0200 Subject: libmain: Make the entire stack overflow handler pluggable --- src/libmain/shared.hh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/libmain/shared.hh') diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh index 66d29a1f7..3c37fd627 100644 --- a/src/libmain/shared.hh +++ b/src/libmain/shared.hh @@ -113,14 +113,15 @@ struct PrintFreed /* Install a SIGSEGV handler to detect stack overflows. */ void detectStackOverflow(); -/* Pluggable behavior to run before _exit(1) in case of a stack overflow. +/* Pluggable behavior to run in case of a stack overflow. - Default value: do nothing, return immediately. + Default value: defaultStackOverflowHandler. This is called by the handler installed by detectStackOverflow(). This gives Nix library consumers a limit opportunity to report the error - condition. + condition. The handler should exit the process. + See defaultStackOverflowHandler() for a reference implementation. NOTE: Use with diligence, because this runs in the signal handler, with very limited stack space and a potentially a corrupted heap, all while the failed -- cgit v1.2.3