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

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/trunk@62952 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2018-03-28 07:01:48 +00:00
parent 1387cbd617
commit ebf5348528
2 changed files with 14 additions and 3 deletions

View file

@ -891,6 +891,8 @@ class TestFileExhaustive < Test::Unit::TestCase
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

View file

@ -22,6 +22,15 @@ static struct code_page_table {
#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, VALUE dname, int abs_mode, int long_na
}
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, VALUE dname, int abs_mode, int long_na
}
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, VALUE dname, int abs_mode, int long_na
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 */