From: shugo@... (Shugo Maeda) Date: 1998-12-25T05:54:35+09:00 Subject: [ruby-dev:3968] load (Re: interpreter reinitialization) --Multipart_Fri_Dec_25_05:39:04_1998-1 Content-Type: text/plain; charset=ISO-2022-JP 前田です。 # なんとか今年中に卒論が完成しそうです。 In message "[ruby-dev:3960] Re: interpreter reinitialization" Yukihiro Matsumoto wrote: > |# safe_levelを4にすると、mod_ruby自体rb_load()を呼べなくなって > |# しまいますね:-( > > あれ? loadやrb_loadはsafe_levelに関わらず呼べるんでないです > か? 第2引数をtrueに指定すれば. では、これはバグですね。 --Multipart_Fri_Dec_25_05:39:04_1998-1 Content-Type: application/octet-stream; type=patch Content-Disposition: attachment; filename="eval.c.diff" Content-Transfer-Encoding: 7bit --- eval.c~ Thu Dec 24 18:28:47 1998 +++ eval.c Fri Dec 25 05:04:55 1998 @@ -4352,7 +4352,6 @@ VALUE self = rb_top_self; TMP_PROTECT; - rb_secure(4); Check_SafeStr(fname); #ifndef __MACOS__ if (RSTRING(fname)->ptr[0] == '~') { --Multipart_Fri_Dec_25_05:39:04_1998-1 Content-Type: text/plain; charset=ISO-2022-JP この変更をした後でも、 ruby -e 'FILE="test.rb"; $SAFE=3; p FILE.tainted?; load(FILE, true)' false /tmp/rba07840:1:in `load': Insecure operation - load (SecurityError) from /tmp/rba07840:1 となってしまいますが、これはなぜでしょう。 エラーメッセージから推測するとCheck_SafeStrでひっかかってるみたいなので すが、tainted?ではfalseが返ってるみたいですし。うーむ。 あともう一つバグを見つけたのですが、それは別メールにします。 > それと,$SAFEに関しては多分 > loadの前にスレッドを起こして > > Thread.start do > load file, true > end > > という組合せで使うべきものなんじゃないかと思ってます(そのつ > もりで設計しました). $SAFEってスレッドローカルなんですね...。 # 知らなかったので、rubyレベルで$SAFEを変更できないようにしてました:-( # 下手な考え休むに似たり。 > |blue[ruby]$ ruby -e 'load("foo.rb", true)' > |/home/shugo/ruby/foo.rb:4: undefined local variable or method `foo' for # (NameError) > | from /tmp/rba00835:1:in `load' > | from /tmp/rba00835:1 > | > |というのはちょっとまずいと思います。 > > ちょっとじゃなくまずいですね.修正します. あと、 def foo puts "foo" end class Bar def bar foo end end b = Bar.new b.bar というのもまずいですね。 モジュール内でクラス定義された場合、そのクラスで自動的にモジュールを インクルードしてくれると解決すると思うのですが、いかがでしょう。 --Multipart_Fri_Dec_25_05:39:04_1998-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="eval.c.diff2" Content-Transfer-Encoding: 7bit --- eval.c.orig Fri Dec 25 05:33:46 1998 +++ eval.c Fri Dec 25 05:34:19 1998 @@ -2666,6 +2666,8 @@ klass = rb_define_class_id(node->nd_cname, super); rb_const_set(ruby_class, node->nd_cname, klass); rb_set_class_path(klass,ruby_class,rb_id2name(node->nd_cname)); + if (TYPE(ruby_class) == T_MODULE) + rb_include_module(klass, ruby_class); rb_obj_call_init(klass); } --Multipart_Fri_Dec_25_05:39:04_1998-1 Content-Type: text/plain; charset=ISO-2022-JP これはloadを使う時以外でも有用だと思います。 -- 前田 修吾 (mailto:shugo@aianet.ne.jp) --Multipart_Fri_Dec_25_05:39:04_1998-1--