From: GOTOU Yuuzou Date: 2005-07-10T16:36:52+09:00 Subject: [ruby-dev:26497] Re: WEBrick DoS vulnerability In message <42CFDD3A.1050100@ruby-lang.org>, `Shugo Maeda ' wrote: > では、1.8では移行措置として、 > > * socketはデフォルトでnon-blocking modeにする。 > * readの挙動も1.9と同様にする。 > (今の1.8の仕様では、non-blocking modeにすることによる挙動の違いが > 大きいため) > * ただし、ユーザが明示的にnon-blocking modeにした場合は、readの挙動 > を現状の1.8と同じ(読めるだけのデータをすぐに返し、single thread > では読めるデータがない場合にはEAGAINを発生)にする。 > > というのはどうでしょう。 EAGAINが発生するのはsingle threadの時だけだとすると、三つ目 はあまりよくないと思います。なぜなら、仮にEAGAINを利用してデー タが読み出せないことを検出するようなライブラリを考えると、そ れはmulti threadの時には期待通りに動作しない可能性があるから です。データの到着を調べる時はthreadを使っているかどうかに関 係なく動くようにIO.selectを使うべきであれば、そのように誘導 する仕様になっているのが好ましいので、EAGAINを上げるという挙 動は残さないほうがいいと私は思います。 最初の二つについては、そのほうが使い勝手がよさそうなので基本 的には賛成です。しかし、読める分だけをとりあえず返すという現 状の仕様にもさほど無理を感じませんから、あまり変えない方向で、 * EAGAINの場合は勝手にリトライする * EAGAINの場合は""を返す * 動作は変えずに、[ruby-dev:25430]で提案されている警告に 「single threadの場合は」という条件を追加する のどれかくらいでいいんじゃないとも思います。 -- ごとうゆうぞう