diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | test/ruby/test_thread.rb | 19 | ||||
-rw-r--r-- | thread.c | 13 | ||||
-rw-r--r-- | version.h | 2 |
4 files changed, 39 insertions, 3 deletions
@@ -1,3 +1,11 @@ +Sat Nov 5 11:35:58 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * thread.c (rb_thread_pending_interrupt_p): no pending interrupt + before initialization. + + * thread.c (thread_raise_m, rb_thread_kill): uninitialized thread + cannot interrupt. [ruby-core:72732] [Bug #11959] + Sat Nov 5 11:16:58 2016 Kenta Murata <mrkn@mrkn.jp> * ext/bigdecimal/bigdecimal.c: Import changes from ruby/bigdecimal diff --git a/test/ruby/test_thread.rb b/test/ruby/test_thread.rb index 6ad33b83d4..97643947ad 100644 --- a/test/ruby/test_thread.rb +++ b/test/ruby/test_thread.rb @@ -748,9 +748,24 @@ _eom end def test_uninitialized - c = Class.new(Thread) - c.class_eval { def initialize; end } + c = Class.new(Thread) {def initialize; end} assert_raise(ThreadError) { c.new.start } + + bug11959 = '[ruby-core:72732] [Bug #11959]' + + c = Class.new(Thread) {def initialize; exit; end} + assert_raise(ThreadError, bug11959) { c.new } + + c = Class.new(Thread) {def initialize; raise; end} + assert_raise(ThreadError, bug11959) { c.new } + + c = Class.new(Thread) { + def initialize + pending = pending_interrupt? + super {pending} + end + } + assert_equal(false, c.new.value, bug11959) end def test_backtrace @@ -1561,6 +1561,14 @@ rb_threadptr_pending_interrupt_enque(rb_thread_t *th, VALUE v) th->pending_interrupt_queue_checked = 0; } +static void +threadptr_check_pending_interrupt_queue(rb_thread_t *th) +{ + if (!th->pending_interrupt_queue) { + rb_raise(rb_eThreadError, "uninitialized thread"); + } +} + enum handle_interrupt_timing { INTERRUPT_NONE, INTERRUPT_IMMEDIATE, @@ -1868,6 +1876,9 @@ rb_thread_pending_interrupt_p(int argc, VALUE *argv, VALUE target_thread) GetThreadPtr(target_thread, target_th); + if (!target_th->pending_interrupt_queue) { + return Qfalse; + } if (rb_threadptr_pending_interrupt_empty_p(target_th)) { return Qfalse; } @@ -2181,6 +2192,7 @@ thread_raise_m(int argc, VALUE *argv, VALUE self) rb_thread_t *target_th; rb_thread_t *th = GET_THREAD(); GetThreadPtr(self, target_th); + threadptr_check_pending_interrupt_queue(target_th); rb_threadptr_raise(target_th, argc, argv); /* To perform Thread.current.raise as Kernel.raise */ @@ -2225,6 +2237,7 @@ rb_thread_kill(VALUE thread) rb_threadptr_to_kill(th); } else { + threadptr_check_pending_interrupt_queue(th); rb_threadptr_pending_interrupt_enque(th, eKillSignal); rb_threadptr_interrupt(th); } @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.3.2" #define RUBY_RELEASE_DATE "2016-11-05" -#define RUBY_PATCHLEVEL 201 +#define RUBY_PATCHLEVEL 202 #define RUBY_RELEASE_YEAR 2016 #define RUBY_RELEASE_MONTH 11 |