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

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/

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