diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2021-06-27 09:42:01 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2021-06-27 11:18:41 +0900 |
commit | 13939d61b4b69bd109c5f41303c79868d639fa44 (patch) | |
tree | 5f96e396fb9667528767c04c590ef98096e1685f | |
parent | 35c7e83bb32869cd96112ffd850b02047b48fac1 (diff) | |
download | ruby-13939d61b4b69bd109c5f41303c79868d639fa44.tar.gz |
Check if closed after each yield [Bug #17661]
-rw-r--r-- | io.c | 4 | ||||
-rw-r--r-- | test/ruby/test_io.rb | 36 |
2 files changed, 39 insertions, 1 deletions
@@ -4052,9 +4052,9 @@ rb_io_each_byte(VALUE io) char *p = fptr->rbuf.ptr + fptr->rbuf.off++; fptr->rbuf.len--; rb_yield(INT2FIX(*p & 0xff)); + rb_io_check_byte_readable(fptr); errno = 0; } - rb_io_check_byte_readable(fptr); READ_CHECK(fptr); } while (io_fillbuf(fptr) >= 0); return io; @@ -4271,6 +4271,7 @@ rb_io_each_codepoint(VALUE io) fptr->cbuf.off += n; fptr->cbuf.len -= n; rb_yield(UINT2NUM(c)); + rb_io_check_byte_readable(fptr); } } NEED_NEWLINE_DECORATOR_ON_READ_CHECK(fptr); @@ -4308,6 +4309,7 @@ rb_io_each_codepoint(VALUE io) else { continue; } + rb_io_check_byte_readable(fptr); } return io; diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index 14592e4d58..7acedb60e2 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -394,6 +394,24 @@ class TestIO < Test::Unit::TestCase } end + def test_each_byte_closed + pipe(proc do |w| + w << "abc def" + w.close + end, proc do |r| + assert_raise(IOError) do + r.each_byte {|byte| r.close if byte == 32 } + end + end) + make_tempfile {|t| + File.open(t, 'rt') {|f| + assert_raise(IOError) do + f.each_byte {|c| f.close if c == 10} + end + } + } + end + def test_each_codepoint make_tempfile {|t| bug2959 = '[ruby-core:28650]' @@ -405,6 +423,24 @@ class TestIO < Test::Unit::TestCase } end + def test_each_codepoint_closed + pipe(proc do |w| + w.print("abc def") + w.close + end, proc do |r| + assert_raise(IOError) do + r.each_codepoint {|c| r.close if c == 32} + end + end) + make_tempfile {|t| + File.open(t, 'rt') {|f| + assert_raise(IOError) do + f.each_codepoint {|c| f.close if c == 10} + end + } + } + end + def test_rubydev33072 t = make_tempfile path = t.path |