[#30722] JSON ライブラリの取り込み — "NARUSE, Yui" <naruse@...>

naruseです。

20 messages 2007/04/21

[ruby-dev:30705] ruby-1.8.6, $SAFE=4, Proc#call

From: Masatoshi SEKI <m_seki@...>
Date: 2007-04-09 15:27:15 UTC
List: ruby-dev #30705
咳といいます。

一度、まつもとさんには私信で質問したのですが、せっかくなのでMLにも投げます。

Proc#callとyieldで、Procが実行される際の$SAFEが異なります。
まつもとさんはProc#callの挙動が意図したものである、とのことでした。(あってますか?>まつもとさん)

yieldの挙動をProc#callと揃える予定はありますか?

スレッドを作って$SAFE = 4でなにかを実行するのにyieldをよく使っていたのですが、
yieldもProc#callの挙動に揃えるとすると、ちょっと面倒です。


---

$SAFE=4のスレッドからProc#callした場合、Procを作ったコンテキストのsafe_levelで
Procが実行されるようです。yieldする場合には、safe_levelが引き継がれます。

これは意図した動作でしょうか?
なんとなくバグな気がします。

例えばこんなスクリプトで実験できます。
four_procの方は$SAFE=4のはずなのに標準出力に印字できます。

## safe.rb
def four_proc(&block)
  Thread.new { $SAFE = 4; block.call }.join
end

def four_yield
  Thread.new { $SAFE = 4; yield }.join
end

four_proc { p :proc }
four_yield { p :yield }


## 実行結果
cinq:~/develop/labo/ruby/misc mas$ ruby safe.rb
:proc
safe.rb:10:in `write': Insecure operation `write' at level 4 (SecurityError)
        from safe.rb:6:in `join'
        from safe.rb:6:in `four_yield'
        from safe.rb:10


In This Thread

Prev Next