[#37959] [Bug:trunk] I can modify literals — Yusuke ENDOH <mame@...>

遠藤です。

13 messages 2009/02/10

[#38005] Is URI.decode() broken? — MOROHASHI Kyosuke <moronatural@...>

もろはしです。いつもお世話になっております。

39 messages 2009/02/14
[#38006] Re: Is URI.decode() broken? — Nobuyoshi Nakada <nobu@...> 2009/02/14

なかだです。

[#38009] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/02/14

成瀬です、

[#38016] Re: Is URI.decode() broken? — Fujioka <fuj@...> 2009/02/15

xibbarこと藤岡です。

[#38017] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/02/15

成瀬です。

[#38040] Re: Is URI.decode() broken? — akira yamada / やまだあきら <akira@...> 2009/02/17

NARUSE, Yui さんは書きました:

[#38124] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/03/03

成瀬です。

[#39214] Re: Is URI.decode() broken? — akira yamada / やまだあきら <akira@...> 2009/09/02

(2009年03月03日 22:45), NARUSE, Yui さんは書きました:

[#39218] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/09/02

成瀬です。

[#39236] Re: Is URI.decode() broken? — Tanaka Akira <akr@...> 2009/09/05

In article <4A9E44DD.6050706@airemix.jp>,

[#39242] Re: Is URI.decode() broken? — KOSAKI Motohiro <kosaki.motohiro@...> 2009/09/07

小崎@思いつきを適当に書いてみるテスト

[#39246] Re: Is URI.decode() broken? — Tanaka Akira <akr@...> 2009/09/07

In article <20090907091830.2C7A.A69D9226@jp.fujitsu.com>,

[#38096] 多重代入やメソッド引数の展開でto_aが呼ばれます — nagachika <nagachika00@...>

nagachika と申します。

10 messages 2009/02/26

[#38098] ブロック引数と括弧・引数なしsuper — Shugo Maeda <shugo@...>

前田です。

12 messages 2009/02/27

[ruby-dev:37959] [Bug:trunk] I can modify literals

From: Yusuke ENDOH <mame@...>
Date: 2009-02-10 17:16:05 UTC
List: ruby-dev #37959
遠藤です。

ObjectSpace を使うと種々のリテラルを書き換えることができてしまうようですが、
仕様でしょうか。


def foo
  "foobarbaz"
end

ObjectSpace.each_object(String) do |s|
  s.replace("evil") if /foobarbaz/ =~ s && !s.frozen?
end

p foo  #=> "evil"

def bar
  `ls -l`
end

ObjectSpace.each_object(String) do |s|
  s.replace("echo rm -rf /") if /ls -l/ =~ s && !s.frozen?
end

p bar  #=> "rm -rf /\n"


バグだとして、リテラルを freeze するパッチを書きましたが、IRC では

  - freeze で解決するのが正しいやり方なのか
  - freeze しても finalizer が付け替えできるのではないか

という感じの指摘がありました。どう直すのがよいでしょう。


Index: compile.c
===================================================================
--- compile.c	(revision 22217)
+++ compile.c	(working copy)
@@ -2120,7 +2120,7 @@
     int cnt = 1;

     debugp_param("nd_lit", lit);
-    ADD_INSN1(ret, nd_line(node), putobject, node->nd_lit);
+    ADD_INSN1(ret, nd_line(node), putobject, rb_obj_freeze(node->nd_lit));

     while (list) {
 	COMPILE(ret, "each string", list->nd_head);
@@ -2236,6 +2236,7 @@
 		rb_ary_push(ary, node->nd_head->nd_lit);
 		node = node->nd_next;
 	    }
+	    rb_obj_freeze(ary);

 	    iseq_add_mark_object_compile_time(iseq, ary);
 	    ADD_INSN1(ret, nd_line(node_root), duparray, ary);
@@ -2708,7 +2709,7 @@

     if (estr != 0) {
 	if (needstr != Qfalse) {
-	    VALUE str = rb_str_new2(estr);
+	    VALUE str = rb_obj_freeze(rb_str_new2(estr));
 	    ADD_INSN1(ret, nd_line(node), putstring, str);
 	    iseq_add_mark_object_compile_time(iseq, str);
 	}
@@ -4353,7 +4354,7 @@
       case NODE_STR:{
 	debugp_param("nd_lit", node->nd_lit);
 	if (!poped) {
-	    ADD_INSN1(ret, nd_line(node), putstring, node->nd_lit);
+	    ADD_INSN1(ret, nd_line(node), putstring, rb_obj_freeze(node->nd_lit));
 	}
 	break;
       }
@@ -4367,7 +4368,7 @@
       }
       case NODE_XSTR:{
 	ADD_CALL_RECEIVER(ret, nd_line(node));
-	ADD_INSN1(ret, nd_line(node), putobject, node->nd_lit);
+	ADD_INSN1(ret, nd_line(node), putobject, rb_obj_freeze(node->nd_lit));
 	ADD_CALL(ret, nd_line(node), ID2SYM(idBackquote), INT2FIX(1));

 	if (poped) {

-- 
Yusuke ENDOH <mame@tsg.ne.jp>

In This Thread

Prev Next