なかだです。

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はできる。 中田 伸悦