From bcba9513202d5c799f76f011ab30c6a115db982e Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 30 Jul 2015 01:42:35 +0000 Subject: load.c: avoid segfault when 'throw' occurs in the middle of rb_load_file_str How can a 'throw' happen while the current thread is reading a Ruby source file from disk and parsing it? It can happen if another thread calls Thread#raise, and passes an Exception object which responds to #exception, and the custom #exception method calls Kernel#throw. In practice, this is most likely to happen if you combine the use of autoload and Timeout.timeout. An extra check is required to avoid a segfault in this case. * load.c (rb_load_internal0): extra check before returning TAG_RAISE when a non-local transfer of control happens while loading and parsing a Ruby source file. [ruby-core:70169] [Bug #11404] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- load.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'load.c') diff --git a/load.c b/load.c index fbe75913bf..54f7307e4c 100644 --- a/load.c +++ b/load.c @@ -621,7 +621,7 @@ rb_load_internal0(rb_thread_t *th, VALUE fname, int wrap) th->top_self = self; th->top_wrapper = wrapper; - if (!loaded && !FIXNUM_P(th->errinfo)) { + if (!loaded && !FIXNUM_P(th->errinfo) && state != TAG_THROW) { /* an error on loading don't include INT2FIX(TAG_FATAL) see r35625 */ return TAG_RAISE; } -- cgit v1.2.3