[#44289] [Ruby 1.9 - Feature #5128][Open] 日本語ドキュメントをUTF-8に — Shyouhei Urabe <shyouhei@...>

34 messages 2011/08/01
[#44293] [Ruby 1.9 - Feature #5128] 日本語ドキュメントをUTF-8に — Nobuyoshi Nakada <nobu@...> 2011/08/01

[#44295] Re: [ruby-dev:44293] [Ruby 1.9 - Feature #5128] 日本語ドキュメントをUTF-8に — Urabe Shyouhei <shyouhei@...> 2011/08/01

(08/01/2011 11:52 AM), Nobuyoshi Nakada wrote:

[#44299] Re: [Ruby 1.9 - Feature #5128] 日本語ドキュメントをUTF-8に — Nobuyoshi Nakada <nobu@...> 2011/08/01

なかだです。

[#44418] [Ruby 1.9 - Feature #5128] 日本語ドキュメントをUTF-8に — Ayumu AIZAWA <ayumu.aizawa@...> 2011/08/24

[#44431] Re: [ruby-dev:44418] [Ruby 1.9 - Feature #5128] 日本語ドキュメントをUTF-8に — KOSAKI Motohiro <kosaki.motohiro@...> 2011/08/27

> あいざわです

[#44443] Re: [Ruby 1.9 - Feature #5128] 日本語ドキュメントをUTF-8に — Ayumu Aizawa <ayumu.aizawa@...> 2011/09/01

あいざわです

[#44315] [Ruby 1.9 - Bug #5139][Open] sigsegv のスタックオーバフロー — Tomoyuki Chikanaga <nagachika00@...>

18 messages 2011/08/02

[#44329] [Ruby 1.9 - Bug #5151][Open] test/socket/test_socket.rb fail when udp connection failed — Ayumu AIZAWA <ayumu.aizawa@...>

16 messages 2011/08/02

[#44368] [Ruby 1.9 - Feature #5180][Open] net/http の接続時に用いる IP アドレスの指定 — Yui NARUSE <naruse@...>

15 messages 2011/08/10

[#44413] [Ruby 1.9 - Bug #5217][Open] lineno is broken when source code has about 7000 lines — Yusuke Endoh <mame@...>

11 messages 2011/08/23

[ruby-dev:44436] [BUG: ruby 1.9.3dev (2011-08-27 revision 33101) [i686-linux]] class オブジェクトの開放時に segv

From: Satoshi Shiba <shiba@...>
Date: 2011-08-27 18:30:59 UTC
List: ruby-dev #44436
芝と申します。

次のようなコードを実行すると、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));
        }

In This Thread

Prev Next