summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-08-09 08:29:38 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-08-09 08:29:38 +0000
commit14ad644d847138de6905200f46f177b28a67f28d (patch)
tree833b5c9d661fb03f97727d213f21f5b059d00580
parent775a40f7d64cca8e04f0d709dd55fb64f5e63f14 (diff)
io.c: fix non-ascii filename inplace edit
* io.c (argf_next_argv): convert filename to the OS encoding to be dealt with by system calls. [ruby-dev:50607] [Bug #14970] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64243 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--io.c2
-rw-r--r--test/ruby/test_argf.rb21
2 files changed, 21 insertions, 2 deletions
diff --git a/io.c b/io.c
index 1d7626c089..9c8d5de03d 100644
--- a/io.c
+++ b/io.c
@@ -8502,6 +8502,7 @@ argf_next_argv(VALUE argf)
VALUE filename = rb_ary_shift(ARGF.argv);
FilePathValue(filename);
ARGF.filename = filename;
+ filename = rb_str_encode_ospath(filename);
fn = StringValueCStr(filename);
if (RSTRING_LEN(filename) == 1 && fn[0] == '-') {
ARGF.current_file = rb_stdin;
@@ -8603,6 +8604,7 @@ argf_next_argv(VALUE argf)
if (!NIL_P(write_io)) {
rb_io_set_write_io(ARGF.current_file, write_io);
}
+ RB_GC_GUARD(filename);
}
if (ARGF.binmode) rb_io_ascii8bit_binmode(ARGF.current_file);
GetOpenFile(ARGF.current_file, fptr);
diff --git a/test/ruby/test_argf.rb b/test/ruby/test_argf.rb
index 311469aad9..d9266b4018 100644
--- a/test/ruby/test_argf.rb
+++ b/test/ruby/test_argf.rb
@@ -35,8 +35,8 @@ class TestArgf < Test::Unit::TestCase
open("#{@tmpdir}/#{basename}-#{@tmp_count}", "w")
end
- def make_tempfile
- t = make_tempfile0("argf-qux")
+ def make_tempfile(basename = "argf-qux")
+ t = make_tempfile0(basename)
t.puts "foo"
t.puts "bar"
t.puts "baz"
@@ -255,6 +255,23 @@ class TestArgf < Test::Unit::TestCase
assert_warning(/#{base}/) {argf.gets}
end
+ def test_inplace_nonascii
+ ext = Encoding.default_external or
+ skip "no default external encoding"
+ t = nil
+ ["\u{3042}", "\u{e9}"].any? {|n| t = make_tempfile(n.encode(ext))} or
+ skip "no name to test"
+ assert_in_out_err(["-i.bak", "-", t.path],
+ "#{<<~"{#"}\n#{<<~'};'}")
+ {#
+ puts ARGF.gets.chomp + '.new'
+ puts ARGF.gets.chomp + '.new'
+ puts ARGF.gets.chomp + '.new'
+ };
+ assert_equal("foo.new\n""bar.new\n""baz.new\n", File.read(t.path))
+ assert_equal("foo\n""bar\n""baz\n", File.read(t.path + ".bak"))
+ end
+
def test_inplace_no_backup
t = make_tempfile