1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

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]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@63806 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
usa 2018-06-30 13:00:09 +00:00
parent 7ac2f89f4e
commit 2d5c52f99a
3 changed files with 15 additions and 4 deletions

View file

@ -863,6 +863,8 @@ class TestFileExhaustive < Test::Unit::TestCase
assert_raise(ArgumentError) { File.expand_path(".", UnknownUserHome) } assert_raise(ArgumentError) { File.expand_path(".", UnknownUserHome) }
assert_nothing_raised(ArgumentError) { File.expand_path("#{DRIVE}/", UnknownUserHome) } assert_nothing_raised(ArgumentError) { File.expand_path("#{DRIVE}/", UnknownUserHome) }
ENV["HOME"] = "#{DRIVE}UserHome"
assert_raise(ArgumentError) { File.expand_path("~") }
ensure ensure
ENV["HOME"] = home ENV["HOME"] = home
end end

View file

@ -1,6 +1,6 @@
#define RUBY_VERSION "2.4.5" #define RUBY_VERSION "2.4.5"
#define RUBY_RELEASE_DATE "2018-06-30" #define RUBY_RELEASE_DATE "2018-06-30"
#define RUBY_PATCHLEVEL 301 #define RUBY_PATCHLEVEL 302
#define RUBY_RELEASE_YEAR 2018 #define RUBY_RELEASE_YEAR 2018
#define RUBY_RELEASE_MONTH 6 #define RUBY_RELEASE_MONTH 6

View file

@ -22,6 +22,15 @@ static struct code_page_table {
#define IS_DIR_SEPARATOR_P(c) (c == L'\\' || c == L'/') #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])) #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 */ /* MultiByteToWideChar() doesn't work with code page 51932 */
#define INVALID_CODE_PAGE 51932 #define INVALID_CODE_PAGE 51932
@ -315,7 +324,7 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
} }
whome_len = wcslen(whome); 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(wpath);
xfree(whome); xfree(whome);
rb_raise(rb_eArgError, "non-absolute home"); rb_raise(rb_eArgError, "non-absolute home");
@ -397,7 +406,7 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
} }
whome_len = wcslen(whome); 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(wpath);
free(wdir); free(wdir);
xfree(whome); xfree(whome);
@ -523,7 +532,7 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
buffer_pos[0] = L'\0'; buffer_pos[0] = L'\0';
/* tainted if path is relative */ /* 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; tainted = 1;
/* FIXME: Make this more robust */ /* FIXME: Make this more robust */