なかだです。 At Sat, 26 Jun 2004 23:05:29 +0900, Yukihiro Matsumoto wrote in [ruby-dev:23817]: > |Procは$SAFEを保存しますが、呼び出し側よりも低いレベルに戻すこと > |ができるのは危険ではないかといわれました。 > |説得力のある意見ではないかと思うのですが、どうでしょうか。 > > 前に考察した時には、Procが汚染されていないということはコード > は信頼できると言うことなので、問題はないと言う結論を出したん > ですが、見落としがあったかな。 そういわれるとそういう気もしてきました。 > まあ、Proc以外では信頼できないコードから呼び出されたら信頼でき > るはずのコードでも$SAFEは高いまま呼んでいるので対称性がない > というのはあると思います。 まぁ他は低くもならなきゃ高くもならないので、比較対象にならなく てもいいんじゃないでしょうか。 > その場合でもフック(trace_funcとか)のようなものはやはり元の > $SAFEレベルで実行されてほしい、というか実行されないと期待通 > り動かないと思います。 途中までは考えてたんだけど、うっかりしてました。一応追加で。
Index: eval.c =================================================================== RCS file: /pub/cvs/ruby/src/ruby/eval.c,v retrieving revision 1.673 diff -u -2 -p -r1.673 eval.c --- eval.c 22 Jun 2004 14:59:25 -0000 1.673 +++ eval.c 28 Jun 2004 07:16:50 -0000 @@ -2456,4 +2456,5 @@ call_trace_func(event, node, self, id, k NODE *node_save; VALUE srcfile; + volatile int safe; if (!trace_func) return; @@ -2490,4 +2491,6 @@ call_trace_func(event, node, self, id, k if ((state = EXEC_TAG()) == 0) { srcfile = rb_str_new2(ruby_sourcefile?ruby_sourcefile:"(ruby)"); + safe = ruby_safe_level; + ruby_safe_level = 0; proc_invoke(trace_func, rb_ary_new3(6, rb_str_new2(event), srcfile, @@ -2498,4 +2501,5 @@ call_trace_func(event, node, self, id, k Qundef, 0); } + ruby_safe_level = safe; if (raised) thread_set_raised(); POP_TAG();
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦