[#30408] Ruby 1.8.6 preview2 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 preview2 をリリースしました。

20 messages 2007/02/24
[#30414] fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Hidetoshi NAGAI <nagai@...> 2007/02/25

永井@知能.九工大です.

[#30418] Re: fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Nobuyoshi Nakada <nobu@...> 2007/02/25

なかだです。

[ruby-dev:30417] Re: fail to autoload at $SAFE==4

From: Hidetoshi NAGAI <nagai@...>
Date: 2007-02-25 15:05:57 UTC
List: ruby-dev #30417
永井@知能.九工大です.

補足情報です.

From: Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
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

In This Thread