Project

General

Profile

Actions

Bug #884

closed

Insecure operation: -r

Added by znz (Kazuhiro NISHIYAMA) over 15 years ago. Updated almost 13 years ago.

Status:
Closed
Target version:
-
ruby -v:
Backport:
[ruby-dev:37446]

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

Actions #1

Updated by matz (Yukihiro Matsumoto) over 15 years ago

  • Assignee set to ko1 (Koichi Sasada)

=begin

=end

Actions #2

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 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

Actions #3

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: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

=end

Actions #4

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0