win32/file.c: fix drive letter

* win32/file.c (rb_file_expand_path_internal): do not make invalid
  (or ADS) path if the path has a drive letter, the result also
  should have be under it.  [ruby-core:68130] [Bug #10858]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49618 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2015-02-17 01:53:32 +00:00
parent 43d08fee46
commit f7a73f3e8b
3 changed files with 19 additions and 6 deletions

View file

@ -401,6 +401,8 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
else {
/* determine if we ignore dir or not later */
path_drive = wpath_pos[0];
wpath_pos += 2;
wpath_len -= 2;
}
}
else if (abs_mode == 0 && wpath_len >= 2 && wpath_pos[0] == L'~') {
@ -495,12 +497,7 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
/* determine if we ignore dir or not */
if (!ignore_dir && path_drive && dir_drive) {
if (towupper(path_drive) == towupper(dir_drive)) {
/* exclude path drive letter to use dir */
wpath_pos += 2;
wpath_len -= 2;
}
else {
if (towupper(path_drive) != towupper(dir_drive)) {
/* ignore dir since path drive is different from dir drive */
ignore_dir = 1;
wdir_len = 0;
@ -534,6 +531,10 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
buffer_pos[0] = L'\\';
buffer_pos++;
}
else if (!dir_drive && path_drive) {
*buffer_pos++ = path_drive;
*buffer_pos++ = L':';
}
if (wdir_len) {
/* tainted if dir is used and dir is tainted */