1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* io.c (rb_io_each_byte): rbuf can be refreshed during yield.

[Bug #5119]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32758 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2011-07-30 14:14:46 +00:00
parent cf310f9741
commit 321346cfa5
3 changed files with 18 additions and 6 deletions

View file

@ -1,3 +1,8 @@
Sat Jul 30 23:14:44 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
* io.c (rb_io_each_byte): rbuf can be refreshed during yield.
[Bug #5119]
Sat Jul 30 22:35:50 2011 Naohisa Goto <ngotogenome@gmail.com>
* strftime.c (NEEDS): avoid SEGV due to integer overflow in

9
io.c
View file

@ -2829,13 +2829,10 @@ rb_io_each_byte(VALUE io)
GetOpenFile(io, fptr);
for (;;) {
p = fptr->rbuf.ptr+fptr->rbuf.off;
e = p + fptr->rbuf.len;
while (p < e) {
fptr->rbuf.off++;
fptr->rbuf.len--;
while (fptr->rbuf.len > 0) {
p = fptr->rbuf.ptr + fptr->rbuf.off++;
e = p + fptr->rbuf.len--;
rb_yield(INT2FIX(*p & 0xff));
p++;
errno = 0;
}
rb_io_check_byte_readable(fptr);

View file

@ -235,6 +235,16 @@ class TestIO < Test::Unit::TestCase
end)
end
def test_each_byte_with_seek
t = make_tempfile
bug5119 = '[ruby-core:38609]'
i = 0
open(t.path) do |f|
f.each_byte {i = f.pos}
end
assert_equal(12, i, bug5119)
end
def test_each_codepoint
t = make_tempfile
bug2959 = '[ruby-core:28650]'