Skip to content

Commit

Permalink
merge revision(s) 62952: [Backport #14638]
Browse files Browse the repository at this point in the history
	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/branches/ruby_2_4@63806 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
unak committed Jun 30, 2018
1 parent 7ac2f89 commit 2d5c52f
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 4 deletions.
2 changes: 2 additions & 0 deletions test/ruby/test_file_exhaustive.rb
Expand Up @@ -863,6 +863,8 @@ def test_expand_path_home_dir_string

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
Expand Down
2 changes: 1 addition & 1 deletion version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.4.5"
#define RUBY_RELEASE_DATE "2018-06-30"
#define RUBY_PATCHLEVEL 301
#define RUBY_PATCHLEVEL 302

#define RUBY_RELEASE_YEAR 2018
#define RUBY_RELEASE_MONTH 6
Expand Down
15 changes: 12 additions & 3 deletions win32/file.c
Expand Up @@ -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
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit 2d5c52f

Please sign in to comment.