From 2d393bf1255864706cabdd9375dd26e33bdf40b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Thu, 10 Oct 2019 17:49:31 +0900 Subject: guard rb_fatal against non-GVL call Suggested by ko1. rb_fatal requires GVL so just in case one lacks, print that information and let the process die. As commented, we cannot print the given messages on such situations. --- error.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'error.c') diff --git a/error.c b/error.c index 0c3633c581..fa750e2a3e 100644 --- a/error.c +++ b/error.c @@ -2668,6 +2668,14 @@ rb_fatal(const char *fmt, ...) va_list args; VALUE mesg; + if (! ruby_thread_has_gvl_p()) { + /* The thread has no GVL. Object allocation impossible (cant run GC), + * thus no message can be printed out. */ + fprintf(stderr, "[FATAL] rb_fatal() outside of GVL\n"); + rb_print_backtrace(); + die(); + } + va_start(args, fmt); mesg = rb_vsprintf(fmt, args); va_end(args); -- cgit v1.2.3