ruby-changes:20710
From: nobu <ko1@a...>
Date: Sat, 30 Jul 2011 23:14:57 +0900 (JST)
Subject: [ruby-changes:20710] nobu:r32758 (trunk, ruby_1_9_3): * io.c (rb_io_each_byte): rbuf can be refreshed during yield.
nobu 2011-07-30 23:14:46 +0900 (Sat, 30 Jul 2011) New Revision: 32758 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32758 Log: * io.c (rb_io_each_byte): rbuf can be refreshed during yield. [Bug #5119] Modified files: branches/ruby_1_9_3/ChangeLog branches/ruby_1_9_3/io.c branches/ruby_1_9_3/test/ruby/test_io.rb trunk/ChangeLog trunk/io.c trunk/test/ruby/test_io.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 32757) +++ ChangeLog (revision 32758) @@ -1,3 +1,8 @@ +Sat Jul 30 23:14:44 2011 Nobuyoshi Nakada <nobu@r...> + + * io.c (rb_io_each_byte): rbuf can be refreshed during yield. + [Bug #5119] + Sat Jul 30 22:35:50 2011 Naohisa Goto <ngotogenome@g...> * strftime.c (NEEDS): avoid SEGV due to integer overflow in Index: io.c =================================================================== --- io.c (revision 32757) +++ io.c (revision 32758) @@ -2829,13 +2829,10 @@ 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); Index: test/ruby/test_io.rb =================================================================== --- test/ruby/test_io.rb (revision 32757) +++ test/ruby/test_io.rb (revision 32758) @@ -235,6 +235,16 @@ 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]' Index: ruby_1_9_3/ChangeLog =================================================================== --- ruby_1_9_3/ChangeLog (revision 32757) +++ ruby_1_9_3/ChangeLog (revision 32758) @@ -1,3 +1,8 @@ +Sat Jul 30 23:14:44 2011 Nobuyoshi Nakada <nobu@r...> + + * io.c (rb_io_each_byte): rbuf can be refreshed during yield. + [Bug #5119] + Sat Jul 30 22:35:50 2011 Naohisa Goto <ngotogenome@g...> * strftime.c (NEEDS): avoid SEGV due to integer overflow in Index: ruby_1_9_3/io.c =================================================================== --- ruby_1_9_3/io.c (revision 32757) +++ ruby_1_9_3/io.c (revision 32758) @@ -2829,13 +2829,10 @@ 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); Index: ruby_1_9_3/test/ruby/test_io.rb =================================================================== --- ruby_1_9_3/test/ruby/test_io.rb (revision 32757) +++ ruby_1_9_3/test/ruby/test_io.rb (revision 32758) @@ -235,6 +235,16 @@ 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]' -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/