[#24536] 「Rubyの落し方」 v.s. ruby_1_8 — akira yamada / やまだあきら <akira@...>

<URL:http://jp.rubyist.net/magazine/?0002-RubyCore>

40 messages 2004/10/20
[#24541] Re: 「Rubyの落し方」 v.s. ruby_1_8 — Yukihiro Matsumoto <matz@...> 2004/10/20

まつもと ゆきひろです

[#24599] 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/26

2004-10-20 (水) の 21:38 +0900 に Yukihiro Matsumoto さんは書きました:

[#24605] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-26 (火) の 16:16 +0900 に akira yamada / やまだあきら さんは書きました:

[#24606] Re: 1.8.2 preview3? — Yukihiro Matsumoto <matz@...> 2004/10/27

まつもと ゆきひろです

[#24608] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 11:48 +0900 に Yukihiro Matsumoto さんは書きました:

[#24620] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 12:42 +0900 に akira yamada / やまだあきら さんは書きました:

[#24629] Re: 1.8.2 preview3? — Tanaka Akira <akr@...17n.org> 2004/10/29

In article <1098888819.9446.14.camel@rice.p.arika.org>,

[ruby-dev:24580] Re: require dumps core

From: nobu@...
Date: 2004-10-23 15:05:43 UTC
List: ruby-dev #24580
なかだです。

At Tue, 19 Oct 2004 18:49:38 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:24527]:
> |> 次のようにすると core を吐きます。
> |> 
> |> % ./ruby -e '
> |> o = Object.new
> |> def o.to_str
> |>   $s.replace ""
> |>   "abc"
> |> end
> |> $" << o
> |> $s = "z" * 0x20000
> |> require $s'
> |
> |こんなとこでしょうか。
> 
> コミットしてください。

とりあえずコミットしましたが、これだけでは不十分そうです。例え
ばrb_find_file()なども問題が起き得ますし、またそこから返された
Stringに関しても同様です。

渡すときと返すときにfreezeするようにしてみました。


Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.717
diff -U2 -p -d -r1.717 eval.c
--- eval.c	22 Oct 2004 03:04:20 -0000	1.717
+++ eval.c	23 Oct 2004 14:44:08 -0000
@@ -6439,4 +6439,5 @@ rb_load(fname, wrap)
     if (!wrap) rb_secure(4);
     FilePathValue(fname);
+    fname = rb_str_new4(fname);
     tmp = rb_find_file(fname);
     if (!tmp) {
@@ -6692,5 +6693,5 @@ search_required(fname, featurep, path)
     int type;
 
-    *featurep = fname = rb_str_new4(fname);
+    *featurep = fname;
     *path = 0;
     ext = strrchr(ftptr = RSTRING(fname)->ptr, '.');
@@ -6706,4 +6707,5 @@ search_required(fname, featurep, path)
 	    *featurep = tmp;
 #ifdef DLEXT2
+	    OBJ_FREEZE(tmp);
 	    if (rb_find_file_ext(&tmp, loadable_ext+1)) {
 		*featurep = tmp;
@@ -6713,4 +6715,5 @@ search_required(fname, featurep, path)
 #else
 	    rb_str_cat2(tmp, DLEXT);
+	    OBJ_FREEZE(tmp);
 	    if (*path = rb_find_file(tmp)) {
 		return 's';
@@ -6764,4 +6767,5 @@ rb_require_safe(fname, safe)
 
     FilePathValue(fname);
+    fname = rb_str_new4(fname);
     saved.vmode = scope_vmode;
     saved.node = ruby_current_node;
@@ -6833,5 +6837,7 @@ rb_require(fname)
     const char *fname;
 {
-    return rb_require_safe(rb_str_new2(fname), ruby_safe_level);
+    VALUE fn = rb_str_new2(fname);
+    OBJ_FREEZE(fn);
+    return rb_require_safe(fn, ruby_safe_level);
 }
 
Index: file.c
===================================================================
RCS file: /cvs/ruby/src/ruby/file.c,v
retrieving revision 1.188
diff -U2 -p -d -r1.188 file.c
--- file.c	17 Oct 2004 22:26:31 -0000	1.188
+++ file.c	23 Oct 2004 14:38:58 -0000
@@ -4105,4 +4105,5 @@ rb_find_file_ext(filep, ext)
 	    rb_raise(rb_eSecurityError, "loading from unsafe file %s", f);
 	}
+	OBJ_FREEZE(fname);
 	f = StringValueCStr(fname);
 	*filep = fname;
@@ -4113,4 +4114,5 @@ rb_find_file_ext(filep, ext)
 	    fname = rb_str_dup(*filep);
 	    rb_str_cat2(fname, ext[i]);
+	    OBJ_FREEZE(fname);
 	    if (file_load_ok(StringValueCStr(fname))) {
 		*filep = fname;
@@ -4133,4 +4135,5 @@ rb_find_file_ext(filep, ext)
 	    fname = rb_str_dup(*filep);
 	    rb_str_cat2(fname, ext[j]);
+	    OBJ_FREEZE(fname);
 	    found = dln_find_file(StringValueCStr(fname), path);
 	    if (found && file_load_ok(found)) {
@@ -4156,4 +4159,5 @@ rb_find_file(path)
 	    rb_raise(rb_eSecurityError, "loading from unsafe path %s", f);
 	}
+	OBJ_FREEZE(path);
 	f = StringValueCStr(path);
     }
@@ -4214,5 +4218,7 @@ rb_find_file(path)
     }
     if (file_load_ok(f)) {
-	return rb_str_new2(f);
+	tmp = rb_str_new2(f);
+	OBJ_FREEZE(tmp);
+	return tmp;
     }
     return 0;


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread