1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

merge revision(s) 53449: [Backport #11959]

* 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]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@56564 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2016-11-05 02:44:06 +00:00
parent d56ccddb31
commit 564082796a
4 changed files with 39 additions and 3 deletions

View file

@ -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

View file

@ -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

View file

@ -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);
}

View file

@ -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