Bug #884
closedInsecure operation: -r
Description
=begin
以下のようにするとエラーメッセージの中に謎の-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
'
%
=end
Updated by matz (Yukihiro Matsumoto) over 15 years ago
- Assignee set to ko1 (Koichi Sasada)
=begin
=end
Updated by matz (Yukihiro Matsumoto) about 15 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:37446] [Bug #884] Insecure operation: -r"
on Mon, 15 Dec 2008 19:58:41 +0900, Kazuhiro NISHIYAMA redmine@ruby-lang.org writes:
|以下のようにするとエラーメッセージの中に謎の-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)を区別する必要がありそうです。どうやっ
て区別できるのかちょっと調べてみますね。
=end
Updated by ko1 (Koichi Sasada) about 15 years ago
=begin
ささだです.
Yukihiro Matsumoto wrote::
|以下のようにするとエラーメッセージの中に謎の-rが出てきます。
|
|% ruby-trunk -ve '$SAFE=4;open("")'
|ruby 1.9.1 (2008-12-14 revision 20736) [i686-linux]
|-e:1:inopen': 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
=end
Updated by ko1 (Koichi Sasada) about 15 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
Applied in changeset r21093.
=end