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
This commit is contained in:
nobu 2018-08-09 08:29:38 +00:00
Родитель 775a40f7d6
Коммит 14ad644d84
2 изменённых файлов: 21 добавлений и 2 удалений

2
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);

Просмотреть файл

@ -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