From: Hidetoshi NAGAI Date: 2008-04-07T23:15:04+09:00 Subject: [ruby-dev:34266] Ruby1.9 での $SAFE==4 時の autoload 動作 永井@知能.九工大です. From: Hidetoshi NAGAI Subject: [ruby-dev:34265] Re: Ruby1.9 での $SAFE==4 での動作の仕様変更について Date: Mon, 7 Apr 2008 10:39:29 +0900 Message-ID: <20080407.103929.74737334.nagai@ai.kyutech.ac.jp> > # これで次の課題に進めます.(^_^; というわけで,次の課題です.(^_^) Ruby 1.9 において,$SAFE==4 の時に autoload がうまく働いてくれません. autoload の設定は $SAFE==0 の時になされていて, 最初に参照されたのが $SAFE==4 の時であったというケースです. Ruby 1.8 では,そうしたケースでも autoload がうまく機能しますが, Ruby 1.9 では "insecure_operation at level 4 (SecurityError)" です. しかもエラーメッセージでは,autoload が働いた時に実行中のメソッドが SecurityError ということにされてしまっています. $SAFE==0 で設定したものを遅延読み込みしているだけと言えるので, autoload による読み込みを行ってもセキュリティ的に問題はないと思えます. 例えば,今,autoload 対象が ----------------------- class ZZZ def hoge [:hoge, $SAFE] end end ------------------------------- であったとします.このとき, ----------------------- autoload :ZZZ, './zzz.rb' module M; end p Thread.new{M.instance_eval('ZZZ.new.hoge')}.value ------------------------------- や ----------------------- autoload :ZZZ, './zzz.rb' module M; end p ZZZ.new.hoge p Thread.new{M.instance_eval('$SAFE=4; ZZZ.new.hoge')}.value ------------------------------- は (当然?) エラーなく実行されますが, ----------------------- autoload :ZZZ, './zzz.rb' module M; end p Thread.new{M.instance_eval('$SAFE=4; ZZZ.new.hoge')}.value ------------------------------- は ---------------------------------------------------------------- ./xx3.rb:3:in `instance_eval': Insecure operation at level 4 (SecurityError) from ./zzza.rb:3:in `instance_eval' from ./zzza.rb:3:in `block in
' ---------------------------------------------------------------- ということになります. エラーメッセージとしても納得しづらい内容だと思います. パッチなしの報告のみですみませんが,よろしくお願い致します. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp