ruby-trunk-changes r32666 - r32672

今日は XMLRPC の basic 認証の不具合と、Method オブジェクトを利用した時の SEGV の不具合修正がありました。

nahi:r32666 2011-07-25 22:21:49 +0900

XMLRPC::Client の basic 認証で user と password を Base64 エンコードする時に Array#pack の "m" 指示子を使っていたため、文字数が増えると改行が挿入されてしまって HTTP ヘッダに埋め込むには不適切な文字列を作ってしまっていたので、 "m0" を指定して改行が入らないように修正しています。 [ruby-core:38164] [Bug #5046]

nahi:r32667 2011-07-25 22:23:45 +0900

r32666 で追加漏れていたテスト用のデータファイルを追加しています。

mame:r32669 2011-07-25 23:29:28 +0900

rb_method_entry_t というメソッドの情報を保持する構造体は YARV の control frame stack から参照されるので thread をマークする時に mark されて通常のオブジェクトとは別に free list のような構造で管理されているのですが(unlinked method entry list)、Method オブジェクトの実体である struct METHOD には rb_method_entry_t がポインタでなく埋め込みで保持されていて、この領域の管理は Method オブジェクトの GC によるので、Method オブジェクトは解放されたけど Thread の VM スタック(Fiber などで保存されてるぶんなど)は保守的 GC の為に解放の対象になっていないという状態が起こる可能性があり、解放済みの領域に mark 処理のためにアクセスして SEGV する可能性がありました。 struct METHOD で rb_method_entry_t を埋め込みからポインタでの保持に変更し、rb_method_entry_t のメモリ管理に倣うようにしています。 [ruby-core:38171] [Bug #5047]
これはとても込み入った不具合ですね。 mame さんお疲れ様でした。

usa:r32670 2011-07-25 23:40:19 +0900

rake の Windows 環境での Rake::Task.[] のテストの間違いを修正しています。

mame:r32671 2011-07-26 00:17:56 +0900

r32669 で struct METHOD の解放時に rb_method_entry_t を free list に繋げるためにメモリを確保する必要があるため、GC 中にメモリ確保しようとしてしまいます。これを避けるために事前に struct METHOD の確保時にそのための struct unlinked_method_entry_list_entry という構造体も確保してしまって、解放時にはそれを利用するようにしています。 [ruby-core:38498]

svn:r32672 2011-07-26 00:18:01 +0900

version.h の日付更新。