ruby-changes:16801
From: nobu <ko1@a...>
Date: Fri, 30 Jul 2010 08:52:14 +0900 (JST)
Subject: [ruby-changes:16801] Ruby:r28796 (trunk, ruby_1_8): * file.c (file_expand_path): home directory must be absolute.
nobu 2010-07-30 08:51:53 +0900 (Fri, 30 Jul 2010) New Revision: 28796 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28796 Log: * file.c (file_expand_path): home directory must be absolute. [ruby-core:31537] Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/file.c branches/ruby_1_8/test/ruby/test_file_exhaustive.rb trunk/ChangeLog trunk/file.c trunk/test/ruby/test_file_exhaustive.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 28795) +++ ChangeLog (revision 28796) @@ -1,3 +1,8 @@ +Fri Jul 30 08:51:51 2010 Nobuyoshi Nakada <nobu@r...> + + * file.c (file_expand_path): home directory must be absolute. + [ruby-core:31537] + Fri Jul 30 08:33:20 2010 Nobuyoshi Nakada <nobu@r...> * file.c (file_expand_path): should check if could find user. Index: test/ruby/test_file_exhaustive.rb =================================================================== --- test/ruby/test_file_exhaustive.rb (revision 28795) +++ test/ruby/test_file_exhaustive.rb (revision 28796) @@ -397,6 +397,18 @@ assert_kind_of(String, File.expand_path("~")) assert_raise(ArgumentError) { File.expand_path("~foo_bar_baz_unknown_user_wahaha") } assert_raise(ArgumentError) { File.expand_path("~foo_bar_baz_unknown_user_wahaha", "/") } + begin + bug3630 = '[ruby-core:31537]' + home = ENV["HOME"] + ENV["HOME"] = nil + assert_raise(ArgumentError) { File.expand_path("~") } + ENV["HOME"] = "~" + assert_raise(ArgumentError, bug3630) { File.expand_path("~") } + ENV["HOME"] = "." + assert_raise(ArgumentError, bug3630) { File.expand_path("~") } + ensure + ENV["HOME"] = home + end assert_incompatible_encoding {|d| File.expand_path(d)} end Index: file.c =================================================================== --- file.c (revision 28795) +++ file.c (revision 28796) @@ -2851,6 +2851,7 @@ tainted = OBJ_TAINTED(fname); if (s[0] == '~' && abs_mode == 0) { /* execute only if NOT absolute_path() */ + long userlen = 0; tainted = 1; if (isdirsep(s[1]) || s[1] == '\0') { buf = 0; @@ -2859,15 +2860,24 @@ } else { s = nextdirsep(b = s); - BUFCHECK(bdiff + (s-b) >= buflen); - memcpy(p, b, s-b); - rb_str_set_len(result, s-b); + userlen = s - b; + BUFCHECK(bdiff + userlen >= buflen); + memcpy(p, b, userlen); + rb_str_set_len(result, userlen); buf = p + 1; - p += s-b; + p += userlen; } if (NIL_P(rb_home_dir(buf, result))) { rb_raise(rb_eArgError, "can't find user %s", buf); } + if (!rb_is_absolute_path(RSTRING_PTR(result))) { + if (userlen) { + rb_raise(rb_eArgError, "non-absolute home of %.*s", (int)userlen, b); + } + else { + rb_raise(rb_eArgError, "non-absolute home"); + } + } BUFINIT(); p = pend; } Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 28795) +++ ruby_1_8/ChangeLog (revision 28796) @@ -1,3 +1,8 @@ +Fri Jul 30 08:51:51 2010 Nobuyoshi Nakada <nobu@r...> + + * file.c (file_expand_path): home directory must be absolute. + [ruby-core:31537] + Fri Jul 30 08:33:20 2010 Nobuyoshi Nakada <nobu@r...> * file.c (file_expand_path): should check if could find user. Index: ruby_1_8/test/ruby/test_file_exhaustive.rb =================================================================== --- ruby_1_8/test/ruby/test_file_exhaustive.rb (revision 28795) +++ ruby_1_8/test/ruby/test_file_exhaustive.rb (revision 28796) @@ -356,6 +356,18 @@ assert_kind_of(String, File.expand_path("~")) assert_raise(ArgumentError) { File.expand_path("~foo_bar_baz_unknown_user_wahaha") } assert_raise(ArgumentError) { File.expand_path("~foo_bar_baz_unknown_user_wahaha", "/") } + begin + bug3630 = '[ruby-core:31537]' + home = ENV["HOME"] + ENV["HOME"] = nil + assert_raise(ArgumentError) { File.expand_path("~") } + ENV["HOME"] = "~" + assert_raise(ArgumentError, bug3630) { File.expand_path("~") } + ENV["HOME"] = "." + assert_raise(ArgumentError, bug3630) { File.expand_path("~") } + ensure + ENV["HOME"] = home + end end def test_basename Index: ruby_1_8/file.c =================================================================== --- ruby_1_8/file.c (revision 28795) +++ ruby_1_8/file.c (revision 28796) @@ -2512,6 +2512,7 @@ tainted = OBJ_TAINTED(fname); if (s[0] == '~') { + long userlen = 0; if (isdirsep(s[1]) || s[1] == '\0') { const char *dir = getenv("HOME"); @@ -2539,9 +2540,10 @@ s++; #endif s = nextdirsep(b = s); - BUFCHECK(bdiff + (s-b) >= buflen); - memcpy(p, b, s-b); - p += s-b; + userlen = s - b; + BUFCHECK(bdiff + userlen >= buflen); + memcpy(p, b, userlen); + p += userlen; *p = '\0'; #ifdef HAVE_PWD_H pwPtr = getpwnam(buf); @@ -2558,6 +2560,14 @@ rb_raise(rb_eArgError, "can't find user %s", buf); #endif } + if (!is_absolute_path(RSTRING_PTR(result))) { + if (userlen) { + rb_raise(rb_eArgError, "non-absolute home of %.*s", userlen, s); + } + else { + rb_raise(rb_eArgError, "non-absolute home"); + } + } } #ifdef DOSISH_DRIVE_LETTER /* skip drive letter */ -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/