diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-07-30 01:42:35 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-07-30 01:42:35 +0000 |
commit | bcba9513202d5c799f76f011ab30c6a115db982e (patch) | |
tree | 0a5810098602150b8cbe02e785579554f0b4b603 /load.c | |
parent | d0240cbb6df88a9d50efdc7792103b29c5ec96e6 (diff) | |
download | ruby-bcba9513202d5c799f76f011ab30c6a115db982e.tar.gz |
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
Diffstat (limited to 'load.c')
-rw-r--r-- | load.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -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; } |