From: Hidetoshi NAGAI Date: 2007-02-26T00:05:57+09:00 Subject: [ruby-dev:30417] Re: fail to autoload at $SAFE==4 永井@知能.九工大です. 補足情報です. From: Hidetoshi NAGAI Subject: [ruby-dev:30414] fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) Date: Sun, 25 Feb 2007 18:41:16 +0900 Message-ID: <20070225.184104.74735484.nagai@ai.kyutech.ac.jp> > 例えば $SAFE==0 で require 'tk' (同時に各ウィジェットクラスについては > autoload が設定されます) した後,$SAFE==4 でいずれかのウィジェットを > 使用しようとして autoload が働くと SecurityError になります. $ ruby -r tk -e 'Thread.new{$SAFE=4; TkButton.new}.value' で容易に再現できると思います. rb_autoload_load() の if 節の条件判断部で rb_provided() を 呼んでいますが,この時点では $SAFE=4 のままです. rb_provided() の変更で search_required() を呼ぶようになった結果, $SAFE=4 で search_required() を呼んでしまうため, SecurityError で落ちるということのようですね. ですので,rb_autoload_load() の問題部分を ------------------------------------------------------- if (!load || !(file = load->nd_lit)) { int saved_safe = ruby_safe_level; int st; ruby_safe_level = load->nd_nth; st = rb_provided(RSTRING(file)->ptr); ruby_safe_level = saved_safe; if (st) return Qfalse; } ------------------------------------------------------- などとして,$SAFE を load->nd_nth にしてやれば 応急処置的に問題を回避できますが, きっとそんなに単純ではまずいのでしょうね. # よくわかってないもので...(^_^; -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp