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/