[#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:44440] [Ruby 1.9 - Bug #5254][Assigned] class オブジェクトの開放時に segv

From: Motohiro KOSAKI <kosaki.motohiro@...>
Date: 2011-09-01 00:15:41 UTC
List: ruby-dev #44440
Issue #5254 has been updated by Motohiro KOSAKI.

Subject changed from  ] class オブジェクトの開放時に segv to class オブジェクトの開放時に segv
Category set to core
Status changed from Open to Assigned
Assignee set to Narihiro Nakamura
Target version set to 1.9.x

チケット化
----------------------------------------
Bug #5254: class オブジェクトの開放時に segv
http://redmine.ruby-lang.org/issues/5254

Author: Anonymous
Status: Assigned
Priority: Normal
Assignee: Narihiro Nakamura
Category: core
Target version: 1.9.x
ruby -v: -


 芝と申します。
 
 次のようなコードを実行すると、gc の sweep フェーズで segv します。
 
 # 再現コード
 ####################################
 class BasicObject
   def singleton_method_added(mid)
     raise
   end
 end
 
 b = proc {}
 class << b; end
 b.clone
 ####################################
 
 b.clone では、class.c 内の rb_singleton_class_clone を呼び出し、class オ
 ブジェクトの複製をします。このとき、class_alloc を呼び出して生の class
 オブジェクトを割り当てるんですが、メソッドテーブルの割り当てを行う前に
 singleton_method_added のコールバックを呼び出しています。このため、
 singleton_method_added のコールバックで例外を吐いたときに、メソッドテー
 ブルの割り当てが行われていない class オブジェクトが出来てしまっています。
 
 obj_free では、class オブジェクトの開放時に、メソッドテーブルが割り当て
 られているかどうかのチェック無しに、rb_free_m_table(RCLASS_M_TBL(obj));
 とし、メソッドテーブルを開放しようとします。rb_free_m_table は、引数とし
 てわたってくるハッシュテーブルが NULL ではないものとして処理を進めている
 ため、上に記述したような、メソッドテーブルの割り当てが行われていない
 class オブジェクトを開放しようとしたときに、segv を吐いてしまうようです。
 
 obj_free からの呼び出し関係と segv の位置は次のような感じです。
 
 obj_free
   rb_free_m_table
     st_foreach
       if (table->entries_packed) { <= ここで segv
 
 これに対する対処としては、rb_singleton_class_clone のメソッドテーブル初
 期化の位置をずらすか、obj_free でメソッドテーブルの解放前にメソッドテー
 ブルが割り当てられているかどうかのチェックをするかの2つがあります。
 rb_singleton_class_clone のように、class オブジェクトの初期化とコール
 バックの呼び出しを共に行うような処理が他に無いとも限らないので、obj_free
 側に手を加えるのがいいと思います。本メール末尾にそのようなパッチを添付し
 ておきます。
 
 参考にしていただければ幸いです。
 よろしくお願いいたします。
 
 
 # パッチ
 
 Index: gc.c
 ===================================================================
 --- gc.c        (revision 33101)
 +++ gc.c        (working copy)
 @@ -2273,7 +2273,9 @@
        case T_MODULE:
        case T_CLASS:
         rb_clear_cache_by_class((VALUE)obj);
 -       rb_free_m_table(RCLASS_M_TBL(obj));
 +       if (RCLASS_M_TBL(obj)) {
 +           rb_free_m_table(RCLASS_M_TBL(obj));
 +       }
         if (RCLASS_IV_TBL(obj)) {
             st_free_table(RCLASS_IV_TBL(obj));
         }


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

In This Thread

Prev Next