ruby-trunk-changes r34463 - r34493

今日は OpenSSL の不具合修正、機能追加と rb_str_modify_expand() の潜在的メモリリークの修正がありました。

emboss:r34463 2012-02-08 09:29:26 +0900

OpenSSL::Cipher の rdoc に IV (初期ベクトル/初期値(Value)かも)を OpenSSL::Cipher#random_iv で生成すべきという説明のところに、key もランダムに生成されるけど、これを IV として流用してしまうと脆弱性になるよということを追記しています。

svn:r34464 2012-02-08 09:29:31 +0900

version.h の日付更新。

emboss:r34469 2012-02-08 10:03:16 +0900

OpenSSL::ASN1::GeneralString の変換用テーブル(?)に定数を追加するところで INT2NUM() を2重に呼んでしまって間違った値が格納されていた不具合を修正しています。 [ruby-core:42358] [Bug #5972]

naruse:r34470 2012-02-08 10:04:07 +0900

r34449 で tool/merger.rb がマージ操作前に working copy に作業中のファイルが残っていたらエラー終了するようにしましたが、svn up でリポジトリの変更を取得するようにしています。取得後に再度ゴミが残ってないか確認しなくていいんですかね?

emboss:r34481 2012-02-08 13:19:33 +0900

OpenSSL::X509::Name#to_a が OID の短縮版の名称を返そうとする時に、短縮版が存在しないと "UNDEF" という文字列にしてしまっていたので、元の長い名前を使うようにしています。 [ruby-core:41769] [Feature #5787]
OID って何だよ、というのはわたしもよくわかってません。

nahi:r34482 2012-02-08 14:27:14 +0900

SSL_CTX_set_options() という OpenSSL の挙動を変更するオプションの設定を OpenSSL::SSL::SSLContext#options= で設定できるようにし、ここにセットするためのビットフラグを OpenSSL の定数として Ruby から使えるように定義を追加しています。 [ruby-core:39673] [Bug #5353]
TLSv1/SSLv3 の脆弱性対策として OP_DONT_INSERT_EMPTY_FRAGMENTS というビットを落とす方法があり、それを Ruby からも実行できるようにしているようです。 詳細は ChangeLog 及び以下の参考 URL を参照してください。 http://www.openssl.org/~bodo/tls-cbc.txt

naruse:r34488 2012-02-08 18:49:36 +0900

OpenSSL::X509 の "street" という主体者フィールド(証明書の発行者の情報)の項目は OpenSSL の 0.9.8m からサポートされたものなので、OpenSSL::X509 のテストから削ってバージョンをチェックしたテストケースを追加してそこでテストするようにしています。

naruse:r34490 2012-02-08 20:47:00 +0900

r34488 の OpenSSL のバージョンチェックの条件が反転していたので修正。

nobu:r34492 2012-02-08 22:30:04 +0900

String のバッファを必要に応じて拡張する C API rb_str_modify_expand() で共有されていない & struct RVALUE に文字列が埋め込まれてない(つまりヒープからバッファを割り当てている文字列)でメモリを再割り当てする時に、以前のバッファを解放していメモリリークの不具合があったのを修正しています。 CRuby のコアで使っているところは共有されている場合に呼ばれているので Ruby のメソッドを使っていてメモリリークが発生することはどうやらなさそうですが、拡張ライブラリで rb_str_modify_expand() を呼んでいて踏む可能性があるもののようです。ただこれまで intern.h にプロトタイプ宣言がなかったみたいなのでおそらくまだ誰も使っていないでしょう。

nobu:r34493 2012-02-08 22:35:27 +0900

r34492 で修正したメモリリークのテストを追加しています。メモリ使用量を監視するために Windows では DL を使って Win32API の GetProcessMemoryInfo() を呼んだり、/proc/self/status を読んだり、 ps(1) コマンドの出力を読んだりしてチェックしています。すごい。