[#41918] [Feature #3647] Array#sample(n, replace=false) — Kenta Murata <redmine@...>

Feature #3647: Array#sample(n, replace=false)

11 messages 2010/08/03

[#41966] [Bug #3673] PTY.getpty with IO.pipe doesn't finish on FreeBSD — Yui NARUSE <redmine@...>

Bug #3673: PTY.getpty with IO.pipe doesn't finish on FreeBSD

9 messages 2010/08/10

[#41969] [Feature #3675] String#prepend, String#>> — Sora Harakami <redmine@...>

Feature #3675: String#prepend, String#>>

15 messages 2010/08/10
[#41976] Re: [Feature #3675] String#prepend, String#>> — Yukihiro Matsumoto <matz@...> 2010/08/10

まつもと ゆきひろです

[#41974] Re: [ruby-cvs:36157] Ruby:r28955 (trunk): * complex.c (nucomp_to_[ifr]): don't allow complex with in-exact — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

7 messages 2010/08/10

[#42003] WEBrickに関するセキュリティ修正 (CVE-2010-0541) — Hideki Yamane <henrich@...>

12 messages 2010/08/11

[#42090] Math::atan2(0, 0) on ruby 1.9.2 — KUBO Takehiro <kubo@...>

久保です。

18 messages 2010/08/22
[#42092] Re: Math::atan2(0, 0) on ruby 1.9.2 — Kenta Murata <muraken@...> 2010/08/22

=1B$B$`$i$?$G$9!#=1B(B

[#42166] Ruby'sライセンスの、BSDLとのデュアルライセンスへの変更 — "NARUSE, Yui" <naruse@...>

Ruby's ライセンスは BSDL と Ruby's のデュアルライセンスになります。

14 messages 2010/08/31

[ruby-dev:42162] Bug #3722 に関するご報告

From: Satoshi Shiba <shiba@...>
Date: 2010-08-31 08:43:40 UTC
List: ruby-dev #42162
芝と申します。

redmine に登録されている Bug #3722 [ruby-core:31783] について調べたとこ
ろ、EXEC_EVENT_HOOK 時の例外情報(th->state)の扱いに問題がありそうです。

バグ報告に貼り付けてあった fail.rb を実行すると vm_iter_break が実行され
るんですが、ここで設定された TAG_BREAK を処理しているときに呼び出す
EXEC_EVENT_HOOK で、TAG_BREAK を th->state に設定したままイベントハンド
ラを実行していました。
コールグラフだとこんな感じです。

vm_iter_break(th->state に TAG_BREAK を設定)
(longjmp で vm_exec へジャンプ)
vm_exec ...(1)
  rb_threadptr_exec_event_hooks (vm.c の1336行目)
    exec_event_hooks
      call_trace_func
        ruby_suppress_tracing
          call_trace_proc
            rb_proc_call_with_block
              rb_vm_invoke_proc
                invoke_block_from_c
                  vm_exec ...(2)

vm_iter_break から (2) の vm_exec まで、th->state が TAG_BREAK のままに
なっていました。このため、(1) の vm_exec で処理すべき TAG_BREAK の処理が
(2) の vm_exec で処理されていて、cfp がずれてしまっているようです。

イベントハンドラ内で例外が発生した場合のことを考えていないので全然使えま
せんが、下のパッチで fail.rb での segv は回避できました。

break の処理時にイベントハンドラで例外が発生した場合、どういう挙動にすべ
きなのかが分からなかったため、ちゃんとしたパッチは作っていませんが、参考
までにご報告いたします。




Index: thread.c
===================================================================
--- thread.c    (revision 29056)
+++ thread.c    (working copy)
@@ -4099,6 +4099,7 @@ ruby_suppress_tracing(VALUE (*func)(VALU
     rb_thread_t *th = GET_THREAD();
     int state, tracing;
     volatile int raised;
+    volatile int _state;
     VALUE result = Qnil;

     if ((tracing = th->tracing) != 0 && !always) {
@@ -4109,6 +4110,8 @@ ruby_suppress_tracing(VALUE (*func)(VALU
     }

     raised = rb_threadptr_reset_raised(th);
+    _state = th->state;
+    th->state = 0;

     PUSH_TAG();
     if ((state = EXEC_TAG()) == 0) {
@@ -4124,6 +4127,7 @@ ruby_suppress_tracing(VALUE (*func)(VALU
     if (state) {
    JUMP_TAG(state);
     }
+    th->state = _state;

     return result;
 }



In This Thread

Prev Next