[#26266] pragma on ripper — nobuyoshi nakada <nobuyoshi.nakada@...>

なかだです。

15 messages 2005/06/02

[#26312] rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org>

最近、とあるプログラム(五月雨)が、無限ループに陥ることが何回かありました。

32 messages 2005/06/09
[#26323] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/10

In article <TYOMLEM04Rqf69aZbLA0000002d@tyomlvem02.e2k.ad.ge.com>,

[#26329] Re: rb_gc_mark_threads spin — nobu@... 2005/06/10

なかだです。

[#26331] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/11

In article <200506101543.j5AFhToG009328@sharui.nakada.niregi.kanuma.tochigi.jp>,

[#26333] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/11

In article <8764wlil9l.fsf@m17n.org>,

[#26334] Re: rb_gc_mark_threads spin — nobu@... 2005/06/11

なかだです。

[#26337] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/11

In article <200506111335.j5BDZkoG019423@sharui.nakada.niregi.kanuma.tochigi.jp>,

[#26405] WEBrick DoS vulnerability — Tanaka Akira <akr@...17n.org>

NetBSD 2.0 で WEBrick を使って HTTP サーバを動かした場合、クライアント

24 messages 2005/06/29
[#26477] Re: WEBrick DoS vulnerability — GOTOU Yuuzou <gotoyuzo@...> 2005/07/08

ごとうゆうぞうです。

[#26480] Re: WEBrick DoS vulnerability — Tanaka Akira <akr@...17n.org> 2005/07/08

In article <20050708.175802.957830318.gotoyuzo@sawara.does.notwork.org>,

[#26481] Re: WEBrick DoS vulnerability — GOTOU Yuuzou <gotoyuzo@...> 2005/07/08

In message <87fyupzgcq.fsf@m17n.org>,

[#26421] Subversion — Shugo Maeda <shugo@...>

前田です。

24 messages 2005/06/30
[#26422] Re: Subversion — Yukihiro Matsumoto <matz@...> 2005/06/30

まつもと ゆきひろです

[#26423] Re: Subversion — "U.Nakamura" <usa@...> 2005/06/30

こんにちは、なかむら(う)です。

[ruby-dev:26346] Re: rb_gc_mark_threads spin

From: Tanaka Akira <akr@...17n.org>
Date: 2005-06-12 14:49:51 UTC
List: ruby-dev #26346
In article <1118586617.180748.27381.nullmailer@x31.priv.netlab.jp>,
  Yukihiro Matsumoto <matz@ruby-lang.org> writes:

> これは rb_gc_mark_threads でFOREACH_THREAD_FROM(main_thread) 
> を使うことで対応した部分ですね。これで[ruby-dev:26312]で報告
> されている無限ループは対処できてると思いますが、どうですか?

はい。

ただ、そういういかにも対処を忘れていそうな状況自体を (簡単に) なくして
しまえるのであれば、そっちのほうがいいだろう、とは思うわけですが。

> 確かに。terminate_process()の中で行っているように
>
>   rb_class_new_instance(2, args, rb_eSystemExit)
>
> を使うべきでしょうね。

やはり。

> |また、そもそも signal は main thread に届くという仕様なので、届いた瞬
> |間に偶然動いていたスレッドを遡って終了させてから main thread に伝播す
> |るのではなく、直接 main thread に送るほうが適切だと思います。
>
> おっしゃる通りで、rb_thread_interrupt()はそのつもりで書いて
> ます。今回はrb_exit()という話ですから、どこかで「signalが届
> いた瞬間偶然動いたスレッドを終了させてからmain threadに伝搬
> させる」ようなコードがあるということですね。それは見落としで
> すから、直す必要があります。どこでしたっけ(trap以外で)。

sigexit -> rb_exit -> terminate_process -> rb_exc_raise
という流れで、signal が到着したタイミングで動いていたスレッドで例外がおきます。

たとえば、次のスクリプトで ^C を送るたびに 1 と 2 のどちらかが表示されます。

% ./ruby -e '
trap(:INT, "EXIT")
t1 = Thread.new { loop { begin loop {}; rescue SystemExit; p 1 end } }
t2 = Thread.new { loop { begin loop {}; rescue SystemExit; p 2 end } }
t1.join
t2.join
'
1
1
2
1
2
2
...

> |さらに、trap で EXIT にすると任意のタイミングで終了させられるようなの
> |ですが、これは危険ではないでしょうか。まぁ、これは安全な signal
> |handling とからむので、そう単純な話ではありませんが。
>
> それでもmain_threadでexitするべきでしょうね。ちょっと考えて
> みます。trap_exec()をいつもmain threadで実行するようにすれば
> 良いのかなあ。

えぇと、伝わらなかった気がするんですが、たとえ malloc とかの途中であろ
うが signal が来ると、そこで Ruby レベルの例外が発生して malloc などが
中断することを指摘しています。

なお、上記のスクリプトで、^C を送りつづけると SEGV します。おそらく、
その危険性のひとつの表れなのではないかという気がします。(調べてないん
で違うかもしれませんが) 

% ./ruby -e '
trap(:INT, "EXIT")
t1 = Thread.new { loop { begin loop {}; rescue SystemExit; p 1 end } }
t2 = Thread.new { loop { begin loop {}; rescue SystemExit; p 2 end } }
t1.join
t2.join
'
1
1
2
2
1
2
2
2
2
2
1
-e:4: [BUG] Segmentation fault
ruby 1.9.0 (2005-06-11) [i686-linux]

(gdb) bt
#0  0x4009e7c1 in kill () from /lib/libc.so.6
#1  0x4009e545 in raise () from /lib/libc.so.6
#2  0x4009fa88 in abort () from /lib/libc.so.6
#3  0x0810645b in rb_bug (fmt=0x0) at error.c:214
#4  0x080d9412 in sigsegv (sig=11) at signal.c:523
#5  <signal handler called>
#6  rb_svar (cnt=0) at eval.c:904
#7  0x080ae4a2 in rb_lastline_get () at parse.y:8506
#8  0x0806def7 in rb_thread_save_context (th=0x8178ff0) at eval.c:10349
#9  0x08061358 in rb_thread_schedule () at eval.c:10903
#10 0x0806635c in rb_thread_fd_writable (fd=2) at eval.c:10948
#11 0x08084a89 in io_fflush (fptr=0x8167110) at io.c:385
#12 0x08084e18 in io_fwrite (str=1075636136, fptr=0x8167110) at io.c:530
#13 0x080850e2 in io_write (io=1, str=1075636136) at io.c:621
#14 0x080702e2 in call_cfunc (func=0x8085020 <io_write>, recv=1075634136, len=4, argc=135741768, argv=0xbfffd1c8)
    at eval.c:5578
#15 0x08069b2a in rb_call0 (klass=1075636676, recv=1075634136, id=7313, oid=95, argc=1, argv=0xbfffd1c8, body=0x401ce424, 
    nosuper=0) at eval.c:5723
#16 0x0805c759 in rb_call (klass=1075636676, recv=1075634136, mid=1075636676, argc=1, argv=0xbfffd1c8, scope=1)
    at eval.c:5945
#17 0x0805c9c4 in rb_funcall (recv=1075634136, mid=95, n=1) at ruby.h:642
#18 0x08088b1a in rb_f_p (argc=1, argv=0xbfffd458) at io.c:631
#19 0x0807030a in call_cfunc (func=0x8088a50 <rb_f_p>, recv=1075673616, len=4, argc=135741768, argv=0xbfffd458)
    at eval.c:5581
#20 0x08069b2a in rb_call0 (klass=1075678356, recv=1075673616, id=7417, oid=95, argc=1, argv=0xbfffd458, body=0x401cea3c, 
    nosuper=0) at eval.c:5723
#21 0x0805c759 in rb_call (klass=1075678356, recv=1075673616, mid=1075678356, argc=1, argv=0xbfffd458, scope=1)
    at eval.c:5945
#22 0x08057e8b in rb_eval (self=1075673616, n=0x5f) at ruby.h:642
#23 0x0805745c in rb_eval (self=1075673616, n=0x5f) at eval.c:3190
#24 0x0805aeb8 in rb_yield_0 (val=6, self=1075673616, klass=0, flags=0, avalue=0) at eval.c:4915
#25 0x08068e64 in rb_f_loop () at eval.c:5061
#26 0x08070311 in call_cfunc (func=0x8068e30 <rb_f_loop>, recv=1075673616, len=4, argc=135741768, argv=0x0) at eval.c:5584
#27 0x08069b2a in rb_call0 (klass=1075678356, recv=1075673616, id=3953, oid=95, argc=0, argv=0x0, body=0x401d7100, 
    nosuper=0) at eval.c:5723
#28 0x0805c759 in rb_call (klass=1075678356, recv=1075673616, mid=1075678356, argc=0, argv=0x0, scope=1) at eval.c:5945
#29 0x08057e8b in rb_eval (self=1075673616, n=0x5f) at ruby.h:642
#30 0x0805a32b in rb_eval (self=1075673616, n=0x5f) at eval.c:3099
#31 0x0805aeb8 in rb_yield_0 (val=1075606396, self=1075673616, klass=0, flags=1, avalue=2) at eval.c:4915
---Type <return> to continue, or q <return> to quit---
#32 0x0806ede9 in rb_thread_yield_0 (arg=95) at eval.c:12114
#33 0x0806ca15 in rb_block_pass (func=0x806ecc0 <rb_thread_yield_0>, arg=1075606396, proc=1075606376) at eval.c:8762
#34 0x08062d21 in rb_thread_start_1 () at eval.c:12068
#35 0x0806804e in ruby_exec_internal () at eval.c:1567
#36 0x08064d1c in ruby_run () at eval.c:1579
#37 0x0805409e in main (argc=95, argv=0x5f, envp=0xbffff904) at main.c:46
(gdb) 
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread