けいじゅ@ラショナルソフトウェアです.

In [ruby-dev:19994] the message: "[ruby-dev:19994] Re: I quote: "Maybe
IRB bug!!"", on Apr/10 13:15(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>私のところだと、$SAFE=1ならいろいろできるんですが、$SAFE=4に
>するとしたとたんSecurityErrorで落ちます。

色々できるって? $SAFE=1した後も, irb上でメソッドが実行できるってこと? 

>でも固まったりはしないなあ。

同じく...

>|b = proc{bind}
>|eval "$SAFE = 1", b
>|p $SAFE
>|#=> 1
>意図通りです。これは「Procの中」ではありませんから。一方、

静的に中ってこと?

>  e = proc{|x| eval x}
>  e.call("$SAFE=1")
>  p $SAFE   #=> 0
>
>になります。もっとも、これは毎回リセットされちゃいますね。
>
>  p e.call("$SAFE")  #=> 0
>
>これはリセットされないようにするべきなのかなあ。

リセットされないと, 2度目から実行(eval)できないのでは?

と思ったけど,

 proc{$SAFE=1; eval "puts $SAFE"}.call

とか

 proc{$SAFE=1; eval "gets"}.call

がエラーにならないのは正常の動作?

# rubyのセキュリティモデルは難しい...

>現状では$SAFEの状態を保存しても動くようにしようと思ったら、Threadを別
>に作るしかないみたいですね。

うーん. こっちでは難しそう... 

irbは一行一行evalしたいわけですよね. evalはThread内で実行しなくてはな
らないので, そうすると$SAFE>1でエラーになってしまう...

でも, $SAFE>1でirbを実行したいってニーズはあんまりないと思いますので,
無理して実行できるように対応する気はあまりないですが.

__
..................................石塚 圭樹@ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---