ruby-changes:51595
From: usa <ko1@a...>
Date: Sat, 30 Jun 2018 22:00:18 +0900 (JST)
Subject: [ruby-changes:51595] usa:r63806 (ruby_2_4): merge revision(s) 62952: [Backport #14638]
usa 2018-06-30 22:00:09 +0900 (Sat, 30 Jun 2018) New Revision: 63806 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63806 Log: merge revision(s) 62952: [Backport #14638] win32/file.c: relative path with drive letter * win32/file.c (IS_ABSOLUTE_PATH_P): home directory should not be a relative path regardless a drive letter. PathIsRelativeW returns FALSE on such path. [ruby-core:86356] [Bug #14638] Modified directories: branches/ruby_2_4/ Modified files: branches/ruby_2_4/test/ruby/test_file_exhaustive.rb branches/ruby_2_4/version.h branches/ruby_2_4/win32/file.c Index: ruby_2_4/version.h =================================================================== --- ruby_2_4/version.h (revision 63805) +++ ruby_2_4/version.h (revision 63806) @@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_4/version.h#L1 #define RUBY_VERSION "2.4.5" #define RUBY_RELEASE_DATE "2018-06-30" -#define RUBY_PATCHLEVEL 301 +#define RUBY_PATCHLEVEL 302 #define RUBY_RELEASE_YEAR 2018 #define RUBY_RELEASE_MONTH 6 Index: ruby_2_4/test/ruby/test_file_exhaustive.rb =================================================================== --- ruby_2_4/test/ruby/test_file_exhaustive.rb (revision 63805) +++ ruby_2_4/test/ruby/test_file_exhaustive.rb (revision 63806) @@ -863,6 +863,8 @@ class TestFileExhaustive < Test::Unit::T https://github.com/ruby/ruby/blob/trunk/ruby_2_4/test/ruby/test_file_exhaustive.rb#L863 assert_raise(ArgumentError) { File.expand_path(".", UnknownUserHome) } assert_nothing_raised(ArgumentError) { File.expand_path("#{DRIVE}/", UnknownUserHome) } + ENV["HOME"] = "#{DRIVE}UserHome" + assert_raise(ArgumentError) { File.expand_path("~") } ensure ENV["HOME"] = home end Index: ruby_2_4/win32/file.c =================================================================== --- ruby_2_4/win32/file.c (revision 63805) +++ ruby_2_4/win32/file.c (revision 63806) @@ -22,6 +22,15 @@ static struct code_page_table { https://github.com/ruby/ruby/blob/trunk/ruby_2_4/win32/file.c#L22 #define IS_DIR_SEPARATOR_P(c) (c == L'\\' || c == L'/') #define IS_DIR_UNC_P(c) (IS_DIR_SEPARATOR_P(c[0]) && IS_DIR_SEPARATOR_P(c[1])) +static int +IS_ABSOLUTE_PATH_P(const WCHAR *path, size_t len) +{ + if (len < 2) return FALSE; + if (ISALPHA(path[0])) + return len > 2 && path[1] == L':' && IS_DIR_SEPARATOR_P(path[2]); + else + return IS_DIR_UNC_P(path); +} /* MultiByteToWideChar() doesn't work with code page 51932 */ #define INVALID_CODE_PAGE 51932 @@ -315,7 +324,7 @@ rb_file_expand_path_internal(VALUE fname https://github.com/ruby/ruby/blob/trunk/ruby_2_4/win32/file.c#L324 } whome_len = wcslen(whome); - if (PathIsRelativeW(whome) && !(whome_len >= 2 && IS_DIR_UNC_P(whome))) { + if (!IS_ABSOLUTE_PATH_P(whome, whome_len)) { free(wpath); xfree(whome); rb_raise(rb_eArgError, "non-absolute home"); @@ -397,7 +406,7 @@ rb_file_expand_path_internal(VALUE fname https://github.com/ruby/ruby/blob/trunk/ruby_2_4/win32/file.c#L406 } whome_len = wcslen(whome); - if (PathIsRelativeW(whome) && !(whome_len >= 2 && IS_DIR_UNC_P(whome))) { + if (!IS_ABSOLUTE_PATH_P(whome, whome_len)) { free(wpath); free(wdir); xfree(whome); @@ -523,7 +532,7 @@ rb_file_expand_path_internal(VALUE fname https://github.com/ruby/ruby/blob/trunk/ruby_2_4/win32/file.c#L532 buffer_pos[0] = L'\0'; /* tainted if path is relative */ - if (!tainted && PathIsRelativeW(buffer) && !(buffer_len >= 2 && IS_DIR_UNC_P(buffer))) + if (!tainted && !IS_ABSOLUTE_PATH_P(buffer, buffer_len)) tainted = 1; /* FIXME: Make this more robust */ Index: ruby_2_4 =================================================================== --- ruby_2_4 (revision 63805) +++ ruby_2_4 (revision 63806) Property changes on: ruby_2_4 ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /trunk:r62952 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/