mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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:
parent
43d08fee46
commit
f7a73f3e8b
3 changed files with 19 additions and 6 deletions
|
@ -1,3 +1,9 @@
|
|||
Tue Feb 17 10:53:29 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* 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]
|
||||
|
||||
Tue Feb 17 10:47:20 2015 Iain Beeston <iain.beeston@gmail.com>
|
||||
|
||||
* hash.c: Added docs to explain that #include? and #member? do not
|
||||
|
|
|
@ -795,6 +795,12 @@ class TestFileExhaustive < Test::Unit::TestCase
|
|||
assert_equal("#{Dir.pwd}/a/b/c", File.expand_path(obj))
|
||||
end
|
||||
|
||||
def test_expand_path_with_drive_letter
|
||||
bug10858 = '[ruby-core:68130] [Bug #10858]'
|
||||
assert_match(%r'/bar/foo\z'i, File.expand_path('z:foo', 'bar'), bug10858)
|
||||
assert_equal('z:/bar/foo', File.expand_path('z:foo', '/bar'), bug10858)
|
||||
end if DRIVE
|
||||
|
||||
def test_basename
|
||||
assert_equal(File.basename(@file).sub(/\.test$/, ""), File.basename(@file, ".test"))
|
||||
assert_equal("", s = File.basename(""))
|
||||
|
|
13
win32/file.c
13
win32/file.c
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue