[#44469] [Ruby 1.9 - Bug #5279][Open] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — Shota Fukumori <sorah@...>

21 messages 2011/09/06
[#44471] [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — Shota Fukumori <sorah@...> 2011/09/06

[#44472] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — "NARUSE, Yui" <naruse@...> 2011/09/06

2011年9月6日11:02 Shota Fukumori <sorah@tubusu.net>:

[#44473] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — "Shota Fukumori (sora_h)" <sorah@...> 2011/09/06

じゃぁ,大丈夫かな.

[#44474] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — Kazuhiko <kazuhiko@...> 2011/09/06

On 06/09/2011 06:10, Shota Fukumori (sora_h) wrote:

[#44541] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — Kazuhiko <kazuhiko@...> 2011/09/24

かずひこです。

[#44549] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — KOSAKI Motohiro <kosaki.motohiro@...> 2011/09/26

> かずひこです。

[#44491] [Ruby 1.9 - Feature #5314][Open] パッケージマネージャをコアリリースに含めて欲しい — Taro MURAOKA <koron.kaoriya@...>

13 messages 2011/09/13

[#44506] [Ruby 1.9 - Feature #5317][Open] rubyのヘッダファイルを使った拡張を行う際にuid_tの宣言回避をする事が出来ない。 — Yasuhiro Matsumoto <mattn.jp@...>

9 messages 2011/09/13

[#44520] [Ruby 1.9 - Bug #5350][Open] WeakRef で謎の NoMethodError — Makoto Kishimoto <redmine@...>

20 messages 2011/09/21

[#44542] [Ruby 1.9 - Bug #5363][Open] OpenSSL::ASN1.decode_all の引数に PEM 形式の証明書を指定すると Segmentation fault が発生する — Hiroshi Yoshida <hexa.diary@...>

8 messages 2011/09/25

[#44546] [Ruby 1.9 - Bug #5368][Open] ensure節でsleepするようなThreadがあるとインタプリタが終了しない — Masaki Matsushita <glass.saga@...>

22 messages 2011/09/26

[ruby-dev:44454] [Ruby 1.9 - Bug #5242][Closed] ] C

From: Motohiro KOSAKI <kosaki.motohiro@...>
Date: 2011-09-02 12:29:13 UTC
List: ruby-dev #44454
Issue #5242 has been updated by Motohiro KOSAKI.

Subject changed from  ] C の Proc の比較のバグ to  ] C 
Status changed from Open to Closed

Duplicated.
----------------------------------------
Bug #5242:  ] C 
http://redmine.ruby-lang.org/issues/5242

Author: Anonymous
Status: Closed
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: -


 芝と申します。
 
 Proc#eq(C の関数は proc.c 内の proc_eq)で、C で定義した Proc
 (rb_proc_new などを用いて定義)の比較を行う箇所に不具合があります。
 C で定義した Proc に対しても iseq を見て比較を行っているため、メモリの状
 況如何で segv を吐いたり false のはずが true になったりします。
 
 問題となる proc_eq は以下のようになっていて、Proc の種類にかかわらず、
 proc->block.iseq->iseq_size, proc->block.iseq->local_size,
 proc->block.iseq->iseq を用いて比較しています。
 proc->block.iseq が IFUNC_NODE だった場合は、関数ポインタの比較など、別
 の方法で比較を行うべきです。
 
 /* 問題の関数 */
 static VALUE
 proc_eq(VALUE self, VALUE other)
 {
   if (self == other) {
     return Qtrue;
   }
   else {
     if (rb_obj_is_proc(other)) {
       rb_proc_t *p1, *p2;
       GetProcPtr(self, p1);
       GetProcPtr(other, p2);
       if (p1->envval == p2->envval &&
         p1->block.iseq->iseq_size == p2->block.iseq->iseq_size &&
         p1->block.iseq->local_size == p2->block.iseq->local_size &&
         MEMCMP(p1->block.iseq->iseq, p2->block.iseq->iseq, VALUE,
                p1->block.iseq->iseq_size) == 0) {
         return Qtrue;
       }
     }
   }
   return Qfalse;
 }
 
 添付する sample.zip に、proc_eq に対するパッチと問題となるコードの例をま
 とめて入れておきます。
 今回のパッチでは、RUBY_VM_IFUNC_P で C の Proc かどうかを判定し、proc 2
 つが共に C の Proc だった場合は、node->nd_cfnc,  node->nd_aid,
 node->nd_tval で比較します。
 
 参考にしていただければ幸いです。
 よろしくお願いいたします。
 
 
 
 /* パッチ */
 diff --git proc.c proc.c
 index 427d1fe..e304295 100644
 --- proc.c
 +++ proc.c
 @@ -766,7 +766,18 @@ proc_eq(VALUE self, VALUE other)
             rb_proc_t *p1, *p2;
             GetProcPtr(self, p1);
             GetProcPtr(other, p2);
 -           if (p1->envval == p2->envval &&
 +           if (RUBY_VM_IFUNC_P(p1->block.iseq) &&
 RUBY_VM_IFUNC_P(p2->block.iseq)) {
 +               NODE *nd_ifunc1, *nd_ifunc2;
 +
 +               nd_ifunc1 = (NODE *)p1->block.iseq;
 +               nd_ifunc2 = (NODE *)p2->block.iseq;
 +               if(nd_ifunc1->nd_cfnc == nd_ifunc2->nd_cfnc &&
 +                  nd_ifunc1->nd_aid == nd_ifunc2->nd_aid &&
 +                  rb_funcall(nd_ifunc1->nd_tval, idEq, 1,
 nd_ifunc2->nd_tval)) {
 +                   return Qtrue;
 +               }
 +           } else if (p1->envval == p2->envval &&
 +               !RUBY_VM_IFUNC_P(p1->block.iseq) &&
 !RUBY_VM_IFUNC_P(p2->block.iseq) &&
                 p1->block.iseq->iseq_size == p2->block.iseq->iseq_size &&
                 p1->block.iseq->local_size == p2->block.iseq->local_size &&
                 MEMCMP(p1->block.iseq->iseq, p2->block.iseq->iseq, VALUE,


-- 
http://redmine.ruby-lang.org

In This Thread

Prev Next