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:
parent
1387cbd617
commit
ebf5348528
2 changed files with 14 additions and 3 deletions
|
@ -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
|
||||
|
|
15
win32/file.c
15
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 */
|
||||
|
|
Loading…
Reference in a new issue