From: Tanaka Akira Date: 2005-07-16T00:48:39+09:00 Subject: [ruby-dev:26552] Re: WEBrick DoS vulnerability In article <480730C6-A742-42EC-9B1B-1B6583FB4A03@mva.biglobe.ne.jp>, Masatoshi SEKI writes: > selectがwrite可能だと教えてくれたときは、 > PIPE_BUF以下のサイズならwriteできるのですか? そうとは限りません。 まず、PIPE_BUF は pipe/fifo に atomic に書き込めることが保証される長さ です。これが select と関連するかというと、規格にはとくに記述が無いよう に思います。ただ、実装としてそうなっているのは珍しくはないのではないか と想像しています。でも、そうでは無い環境もあり、例がいくつか http://cr.yp.to/docs/unixport.html に出ています。 そして、PIPE_BUF は socket とはとくに関係ありません。なので、socket で ブロックしなくなる保証があるかといえばありません。たとえば、4.4BSD な ら select で writable とされたときに書き込めることが保証される量は setsockopt で設定できる SO_SNDLOWAT になり、デフォルトでは 2048 です。 PIPE_BUF は 512 ですが、SO_SNDLOWAT をそれよりも小さく設定することは可 能です。とはいえ、そういう設定をしないデフォルト状態では PIPE_BUF は SO_SNDLOWAT より小さいので、ブロックしないはずです。もちろん、select と write の間に他のプロセスが書き込んだ場合は別ですが。 従って、この対処は少なくとも 4.4BSD でのデフォルト状態においては問題を 解決するといえますが、他の OS の状況はまた異なるでしょうし、問題がなく なったとはいえません。 -- [田中 哲][たなか あきら][Tanaka Akira]