From ebf53485287780ba1642c59963e996999c43b976 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 28 Mar 2018 07:01:48 +0000 Subject: 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 --- win32/file.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'win32/file.c') diff --git a/win32/file.c b/win32/file.c index 6f157d4d38..fe3f7c02d3 100644 --- a/win32/file.c +++ b/win32/file.c @@ -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 */ -- cgit v1.2.3