From: SASADA Koichi Date: 2008-12-24T23:55:43+09:00 Subject: [ruby-dev:37583] Re: [Bug #884] Insecure operation: -r  ささだです. Yukihiro Matsumoto wrote:: > |以下のようにするとエラーメッセージの中に謎の-rが出てきます。 > | > |% ruby-trunk -ve '$SAFE=4;open("")' > |ruby 1.9.1 (2008-12-14 revision 20736) [i686-linux] > |-e:1:in `open': Insecure operation: -r (SecurityError) > | from -e:1:in `
' > |% > > メソッド(open)の中でrb_check_safe_obj()が呼ばれてエラーになっ > た時、そのメソッドがトップレベルで呼ばれた場合、 > rb_frame_callee()がNULLであるため、-rで発生したエラーと勘違 > いするせいのようです。 > > rb_check_safe_obj()では、トップレベルで呼ばれたメソッドと、 > 実行環境が発生する前(-r)を区別する必要がありそうです。どうやっ > て区別できるのかちょっと調べてみますね。  そもそも,rb_frame_callee() が caller を見るのが良くないですね. rb_f_method_name() の名前に引っ張られて,本来 rb_frame_caller() といった 名前にするところを rb_frame_callee() という名前にしているのが良くない.  というわけで,こんなパッチを書いてみましたがどうでしょうか. Index: eval.c =================================================================== --- eval.c (リビジョン 20968) +++ eval.c (作業コピー) @@ -750,6 +750,12 @@ rb_frame_this_func(void) ID rb_frame_callee(void) { + return frame_func_id(GET_THREAD()->cfp); +} + +static ID +rb_frame_caller(void) +{ rb_thread_t *th = GET_THREAD(); rb_control_frame_t *prev_cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp); /* check if prev_cfp can be accessible */ @@ -1105,7 +1111,7 @@ rb_f_local_variables(void) static VALUE rb_f_method_name(void) { - ID fname = rb_frame_callee(); + ID fname = rb_frame_caller(); /* need *caller* ID */ if (fname) { return ID2SYM(fname); -- // SASADA Koichi at atdot dot net