aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2022-03-29 13:38:55 -0400
committerAlan Wu <XrXr@users.noreply.github.com>2022-06-03 13:50:32 -0400
commite4fe3473027393aa084f4e6b2a01c29ec8281f99 (patch)
treeed4f3ada4891a93b9d0242353468553b04937e8e
parent9125374726fbf68c05ee7585d4a374ffc5efc5db (diff)
downloadruby-e4fe3473027393aa084f4e6b2a01c29ec8281f99.tar.gz
Prevent printing crash report in a loop
In the event that we are crashing due to a corrupt Ruby stack, we might re-enter rb_vm_bugreport() due to failed assertions in rb_backtrace_print_as_bugreport() or SDR(). In these cases we were printing the bug report ad infinitum with unbounded recusion. I seem to run into this every once in a while and the amount of log it prints out is pretty distracting. On CI environments it makes the log output unnecessarily big. Let's fix this.
-rw-r--r--vm_dump.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/vm_dump.c b/vm_dump.c
index 5c79e80352..9c7227b3d7 100644
--- a/vm_dump.c
+++ b/vm_dump.c
@@ -1021,6 +1021,17 @@ rb_vm_bugreport(const void *ctx)
}
}
+ // Thread unsafe best effort attempt to stop printing the bug report in an
+ // infinite loop. Can happen with corrupt Ruby stack.
+ {
+ static bool crashing = false;
+ if (crashing) {
+ fprintf(stderr, "Crashed while printing bug report\n");
+ return;
+ }
+ crashing = true;
+ }
+
#ifdef __linux__
# define PROC_MAPS_NAME "/proc/self/maps"
#endif