diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | process.c | 13 | ||||
-rw-r--r-- | test/ruby/test_process.rb | 10 | ||||
-rw-r--r-- | version.h | 2 |
4 files changed, 35 insertions, 3 deletions
@@ -1,3 +1,16 @@ +Thu Feb 25 18:36:26 2016 NAKAMURA Usaku <usa@ruby-lang.org> + + * process.c (rb_execarg_parent_start1): need to convert the encoding to + ospath's one. + +Thu Feb 25 18:36:26 2016 NAKAMURA Usaku <usa@ruby-lang.org> + + * process.c: use rb_w32_uchdir() instead of plain chdir() on Windows. + reported by naruse via twitter. + + * process.c (rb_execarg_addopt): need to convert the encoding to + ospath's one. + Thu Feb 25 18:21:55 2016 Eric Wong <e@80x24.org> * ext/stringio/stringio.c (strio_binmode): implement to set encoding @@ -1753,6 +1753,7 @@ rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val) rb_raise(rb_eArgError, "chdir option specified twice"); } FilePathValue(val); + val = rb_str_encode_ospath(val); eargp->chdir_given = 1; eargp->chdir_dir = hide_obj(EXPORT_DUP(val)); } @@ -2793,11 +2794,14 @@ run_exec_open(VALUE ary, struct rb_execarg *sargp, char *errmsg, size_t errmsg_b VALUE elt = RARRAY_AREF(ary, i); int fd = FIX2INT(RARRAY_AREF(elt, 0)); VALUE param = RARRAY_AREF(elt, 1); - char *path = RSTRING_PTR(RARRAY_AREF(param, 0)); + VALUE vpath = RARRAY_AREF(param, 0); int flags = NUM2INT(RARRAY_AREF(param, 1)); int perm = NUM2INT(RARRAY_AREF(param, 2)); int need_close = 1; - int fd2 = redirect_open(path, flags, perm); /* async-signal-safe */ + int fd2; + FilePathValue(vpath); + vpath = rb_str_encode_ospath(vpath); + fd2 = redirect_open(RSTRING_PTR(vpath), flags, perm); /* async-signal-safe */ if (fd2 == -1) { ERRMSG("open"); return -1; @@ -2952,6 +2956,11 @@ save_env(struct rb_execarg *sargp) } #endif +#ifdef _WIN32 +#undef chdir +#define chdir(p) rb_w32_uchdir(p) +#endif + /* This function should be async-signal-safe when sargp is NULL. Hopefully it is. */ int rb_execarg_run_options(const struct rb_execarg *eargp, struct rb_execarg *sargp, char *errmsg, size_t errmsg_buflen) diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index 28e08ced2b..ec59c8eb30 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -413,6 +413,16 @@ class TestProcess < Test::Unit::TestCase } end + def test_execopts_open_chdir_m17n_path + with_tmpchdir {|d| + Dir.mkdir "テスト" + system(*PWD, :chdir => "テスト", :out => "open_chdir_テスト") + assert_file.exist?("open_chdir_テスト") + assert_file.not_exist?("テスト/open_chdir_テスト") + assert_equal("#{d}/テスト", File.read("open_chdir_テスト").chomp.encode(__ENCODING__)) + } + end if windows? || Encoding.find('locale') == Encoding::UTF_8 + UMASK = [RUBY, '-e', 'printf "%04o\n", File.umask'] def test_execopts_umask @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.1.9" #define RUBY_RELEASE_DATE "2016-02-25" -#define RUBY_PATCHLEVEL 449 +#define RUBY_PATCHLEVEL 450 #define RUBY_RELEASE_YEAR 2016 #define RUBY_RELEASE_MONTH 2 |