ruby-changes:30630
From: nobu <ko1@a...>
Date: Tue, 27 Aug 2013 17:03:12 +0900 (JST)
Subject: [ruby-changes:30630] nobu:r42709 (trunk): io.c: copy in binary mode
nobu 2013-08-27 17:03:00 +0900 (Tue, 27 Aug 2013) New Revision: 42709 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=42709 Log: io.c: copy in binary mode * io.c (copy_stream_body): should write in binary mode. based on a patch by godfat (Lin Jen-Shin) at [ruby-core:56556]. [ruby-core:56518] [Bug #8767] Modified files: trunk/ChangeLog trunk/io.c trunk/test/ruby/test_io.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 42708) +++ ChangeLog (revision 42709) @@ -1,3 +1,13 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Tue Aug 27 17:02:58 2013 Nobuyoshi Nakada <nobu@r...> + + * io.c (copy_stream_body): should write in binary mode. based on a + patch by godfat (Lin Jen-Shin) at [ruby-core:56556]. + [ruby-core:56518] [Bug #8767] + +Tue Aug 27 17:02:33 2013 Nobuyoshi Nakada <nobu@r...> + + * io.c (copy_stream_body): move common open flags. + Tue Aug 27 16:56:50 2013 Nobuyoshi Nakada <nobu@r...> * enumerator.c (enumerator_size): use rb_check_funcall() instead of Index: io.c =================================================================== --- io.c (revision 42708) +++ io.c (revision 42709) @@ -10229,9 +10229,9 @@ copy_stream_body(VALUE arg) https://github.com/ruby/ruby/blob/trunk/io.c#L10229 #ifdef O_BINARY if (src_fptr) SET_BINARY_MODE_WITH_SEEK_CUR(src_fptr); - if (dst_fptr) - setmode(dst_fd, O_BINARY); #endif + if (dst_fptr) + rb_io_ascii8bit_binmode(dst_io); if (stp->src_offset == (off_t)-1 && src_fptr && src_fptr->rbuf.len) { size_t len = src_fptr->rbuf.len; Index: test/ruby/test_io.rb =================================================================== --- test/ruby/test_io.rb (revision 42708) +++ test/ruby/test_io.rb (revision 42709) @@ -857,6 +857,47 @@ class TestIO < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_io.rb#L857 } end + def test_copy_stream_write_in_binmode + bug8767 = '[ruby-core:56518] [Bug #8767]' + mkcdtmpdir { + EnvUtil.with_default_internal(Encoding::UTF_8) do + # StringIO to object with to_path + bytes = "\xDE\xAD\xBE\xEF".force_encoding(Encoding::ASCII_8BIT) + src = StringIO.new(bytes) + dst = Object.new + def dst.to_path + "qux" + end + assert_nothing_raised(bug8767) { + IO.copy_stream(src, dst) + } + assert_equal(bytes, File.binread("qux"), bug8767) + assert_equal(4, src.pos, bug8767) + end + } + end + + def test_copy_stream_read_in_binmode + bug8767 = '[ruby-core:56518] [Bug #8767]' + mkcdtmpdir { + EnvUtil.with_default_internal(Encoding::UTF_8) do + # StringIO to object with to_path + bytes = "\xDE\xAD\xBE\xEF".force_encoding(Encoding::ASCII_8BIT) + File.binwrite("qux", bytes) + dst = StringIO.new + src = Object.new + def src.to_path + "qux" + end + assert_nothing_raised(bug8767) { + IO.copy_stream(src, dst) + } + assert_equal(bytes, dst.string.b, bug8767) + assert_equal(4, dst.pos, bug8767) + end + } + end + class Rot13IO def initialize(io) @io = io -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/