[ruby-trunk - Bug #6099][Open] [BUG] probable buffer overflow

Issue #6099 has been reported by Usaku NAKAMURA.


Bug #6099: [BUG] probable buffer overflow
https://bugs.ruby-lang.org/issues/6099

Author: Usaku NAKAMURA
Status: Open
Priority: Low
Assignee:
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

Issue #6099 has been updated by Masaki M…

=begin
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
=end

Bug #6099: [BUG] probable buffer overflow

Author: Usaku NAKAMURA
Status: Open
Priority: Low
Assignee:
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

Issue #6099 has been updated by Yui NARUSE.

Status changed from Closed to Assigned
Assignee set to Nobuyoshi N.
Priority changed from Low to Normal

Masaki M. wrote:

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

Author: Usaku NAKAMURA
Status: Assigned
Priority: Normal
Assignee: Nobuyoshi N.
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

Issue #6099 has been updated by Glass_saga (Masaki M.).

Yui NARUSE wrote:

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] が出たら明らかにおかしいんですが、そのコードが通ることを期待するのも間違っています。

IO#readpartialも場合によってはblockする事があるんですね。
勉強になりました。

Bug #6099: [BUG] probable buffer overflow

Author: usa (Usaku NAKAMURA)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
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

Issue #6099 has been updated by naruse (Yui NARUSE).

Status changed from Assigned to Closed


Bug #6099: [BUG] probable buffer overflow

Author: usa (Usaku NAKAMURA)
Status: Closed
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
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