[前][次][番号順一覧][スレッド一覧]

ruby-changes:27699

From: luislavena <ko1@a...>
Date: Thu, 14 Mar 2013 12:56:27 +0900 (JST)
Subject: [ruby-changes:27699] luislavena:r39751 (trunk): Refactor rb_file_expand_path_internal for dir_string corner cases

luislavena	2013-03-14 12:56:09 +0900 (Thu, 14 Mar 2013)

  New Revision: 39751

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=39751

  Log:
    Refactor rb_file_expand_path_internal for dir_string corner cases
    
    * win32/file.c (get_user_from_path):  add internal function that retrieves
      username from supplied path (refactored).
    * win32/file.c (rb_file_expand_path_internal):  refactor expansion of user
      home to use get_user_from_path and cover dir_string corner cases.
      [ruby-core:53168] [Bug #8034]

  Modified files:
    trunk/ChangeLog
    trunk/win32/file.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 39750)
+++ ChangeLog	(revision 39751)
@@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Thu Mar 14 12:53:15 2013  Luis Lavena  <luislavena@g...>
+
+	* win32/file.c (get_user_from_path):  add internal function that retrieves
+	  username from supplied path (refactored).
+	* win32/file.c (rb_file_expand_path_internal):  refactor expansion of user
+	  home to use get_user_from_path and cover dir_string corner cases.
+	  [ruby-core:53168] [Bug #8034]
+
 Thu Mar 14 11:53:01 2013  Narihiro Nakamura  <authornari@g...>
 
 	* NEWS: describe RUBY_HEAP_SLOTS_GROWTH_FACTOR.
Index: win32/file.c
===================================================================
--- win32/file.c	(revision 39750)
+++ win32/file.c	(revision 39751)
@@ -317,6 +317,37 @@ replace_to_long_name(wchar_t **wfullpath https://github.com/ruby/ruby/blob/trunk/win32/file.c#L317
     return size;
 }
 
+static inline VALUE
+get_user_from_path(wchar_t **wpath, int offset, UINT cp, UINT path_cp, rb_encoding *path_encoding)
+{
+    VALUE result, tmp;
+    wchar_t *wuser = *wpath + offset;
+    wchar_t *pos = wuser;
+    char *user;
+    size_t size;
+
+    while (!IS_DIR_SEPARATOR_P(*pos) && *pos != '\0')
+     pos++;
+
+    *pos = '\0';
+    convert_wchar_to_mb(wuser, &user, &size, cp);
+
+    /* convert to VALUE and set the path encoding */
+    if (path_cp == INVALID_CODE_PAGE) {
+	tmp = rb_enc_str_new(user, size, rb_utf8_encoding());
+	result = rb_str_encode(tmp, rb_enc_from_encoding(path_encoding), 0, Qnil);
+	rb_str_resize(tmp, 0);
+    }
+    else {
+	result = rb_enc_str_new(user, size, path_encoding);
+    }
+
+    if (user)
+	xfree(user);
+
+    return result;
+}
+
 VALUE
 rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_name, VALUE result)
 {
@@ -405,32 +436,10 @@ rb_file_expand_path_internal(VALUE fname https://github.com/ruby/ruby/blob/trunk/win32/file.c#L436
 	}
     }
     else if (abs_mode == 0 && wpath_len >= 2 && wpath_pos[0] == L'~') {
-	wchar_t *wuser = wpath_pos + 1;
-	wchar_t *pos = wuser;
-	char *user;
-
-	/* tainted if expanding '~' */
-	tainted = 1;
-
-	while (!IS_DIR_SEPARATOR_P(*pos) && *pos != '\0')
-	    pos++;
-
-	*pos = '\0';
-	convert_wchar_to_mb(wuser, &user, &size, cp);
-
-	/* convert to VALUE and set the path encoding */
-	if (path_cp == INVALID_CODE_PAGE) {
-	    VALUE tmp = rb_enc_str_new(user, size, rb_utf8_encoding());
-	    result = rb_str_encode(tmp, rb_enc_from_encoding(path_encoding), 0, Qnil);
-	    rb_str_resize(tmp, 0);
-	}
-	else {
-	    result = rb_enc_str_new(user, size, path_encoding);
-	}
+	result = get_user_from_path(&wpath_pos, 1, cp, path_cp, path_encoding);
 
-	xfree(wpath);
-	if (user)
-	    xfree(user);
+	if (wpath)
+	    xfree(wpath);
 
 	rb_raise(rb_eArgError, "can't find user %s", StringValuePtr(result));
     }
@@ -496,6 +505,16 @@ rb_file_expand_path_internal(VALUE fname https://github.com/ruby/ruby/blob/trunk/win32/file.c#L505
 		    wdir_len = pos - 1;
 	    }
 	}
+	else if (abs_mode == 0 && wdir_len >= 2 && wdir_pos[0] == L'~') {
+	    result = get_user_from_path(&wdir_pos, 1, cp, path_cp, path_encoding);
+	    if (wpath)
+		xfree(wpath);
+
+	    if (wdir)
+		xfree(wdir);
+
+	    rb_raise(rb_eArgError, "can't find user %s", StringValuePtr(result));
+	}
     }
 
     /* determine if we ignore dir or not */

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]