From: Yui NARUSE Date: 2012-03-07T10:49:29+09:00 Subject: [ruby-dev:45318] [ruby-trunk - Bug #6099][Assigned] [BUG] probable buffer overflow Issue #6099 has been updated by Yui NARUSE. Status changed from Closed to Assigned Assignee set to Nobuyoshi Nakada Priority changed from Low to Normal Masaki Matsushita wrote: > IO#readpartialにも同様の問題があるようです。 > > require "fcntl" > > r, w = IO.pipe > r.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK) > buf = " " * 100 > t = Thread.new{p r.readpartial(100, buf)} > sleep 0.1 > Thread.pass > buf.replace("") > p buf.bytesize; w.write("a" * 100) > Thread.pass > t.join IO#readpartial は * It blocks only if ios has no data immediately available. * The later means that readpartial is nonblocking-flag insensitive. * It blocks on the situation IO#sysread causes Errno::EWOULDBLOCK as if the fd is blocking mode. などとある通り、r.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK) しても block することがあります。 よって、[BUG] が出たら明らかにおかしいんですが、そのコードが通ることを期待するのも間違っています。 ---------------------------------------- Bug #6099: [BUG] probable buffer overflow https://bugs.ruby-lang.org/issues/6099 Author: Usaku NAKAMURA Status: Assigned Priority: Normal Assignee: Nobuyoshi Nakada Category: core Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2012-02-27 trunk 34828) [i386-netbsdelf] ふと思い立って以下のようなコードを実行してみたところ、表題の[BUG]となりました。 あんまり重大ではないと考えますが、一応報告しておきます。 他のメソッドでも似たようなことができるものはあると思います。 なお、プラットフォーム依存はないはずです。 % ruby -e ' r, w = IO.pipe buf = " " * 100 Thread.new{p r.sysread(100, buf)} Thread.pass buf.replace("") p buf.bytesize; w.write("a" * 100) Thread.pass ' -- http://bugs.ruby-lang.org/