ruby-trunk-changes r43766 - r43803

今日は浮動小数点数の文字列からのパース/変換時に長い文字列を渡すととても時間がかかるという問題を修正したセキュリティフィックスがありました。これを受けて 2.0.0-p353, 1.9.3-p484 がそれぞれリリースされました。関係者の皆様お疲れさまでした。特に @hsbt さんにはいつもリリースアナウンスの掲載などでお世話になっております。

浮動小数点数パースにおけるヒープオーバーフロー (CVE-2013-4164)
https://www.ruby-lang.org/ja/news/2013/11/22/heap-overflow-in-floating-point-parsing-cve-2013-4164/

https://www.ruby-lang.org/ja/news/2013/11/22/ruby-2-0-0-p353-is-released/

https://www.ruby-lang.org/ja/news/2013/11/22/ruby-1-9-3-p484-is-released/

その他にも昨日の変更の不具合修正や、拡張ライブラリ bigdecimal の不具合修正や RubyGems の更新(ただしバグがあるみたいです)などがありました。

ko1:r43766 2013-11-21 22:34:38 +0900

r43755 で RGenGC のチェックを実行する RGENGC_CHECK_MODE を 3 にセットしたままコミットしてしまっていたのでデフォルトが 0 になるように直しています。

drbrain:r43767 2013-11-22 08:27:30 +0900

RubyGems の最新版をマージしています。バージョンは変更していない模様。 Gemfile や gem.deps.rb をデフォルトで認識するように! という機能を入れているらしいのですが、どうも派手に壊れているらしくカレントディレクトリに Gemfile があると依存関係の解決に失敗してしまい ruby の起動時にエラーが発生して終了してしまうようになっています。バグがみつかったら 2.1.0 リリース前に revert するよって書かれてますが preview2 が出る前に revert したほうがよさそうですね。

svn:r43768 2013-11-22 08:27:37 +0900

version.h の日付更新。

naruse:r43769 2013-11-22 09:05:34 +0900

r43763 で malloc_usable_size() のために malloc.h を #include するようにしましたが FreeBSD では malloc_np.h でないといけなくてビルドに失敗していたので configure でヘッダを検出して使えるほうを #include するようにしています。

zzak:r43770 2013-11-22 09:43:08 +0900

r43753 で追加した Digest の bubblebabble のテストで expectation と actual の引数の順番が逆だったので修正しています。

ko1:r43771 2013-11-22 10:38:08 +0900

プロセス終了時に VM 構造体 のメモリ解放を ruby_mimmalloc() で確保していたものを ruby_xfree() で解放していたのですが、ruby_xfree() は ObjectSpace が解放された後は利用できないのでメモリエラーが発生していたので ruby_mimfree() という関数を追加してこれを利用して解放するようにしています。

naruse:r43772 2013-11-22 11:06:23 +0900

RDoc のテスト用のスクリプトで gem "minitest" による minitest.gem のバージョン指定は Test::Unit が未定義の時だけ実行するようにしています。 test-all は gem メソッドを再定義している可能性があってテスト失敗に繋がる可能性があるためとのこと。

akr:r43773 2013-11-22 12:03:11 +0900

set_trace_func のテストで対象の Thread を記録しておいて他の Thread からのイベントは無視するようにしています。マルチスレッドでテストを実行するようにしたとかでしょうか。

nobu:r43774 2013-11-22 12:17:16 +0900

OpenSSL::Buffering#initialize が r43740 で引数なしに変更されたのを revert して任意の引数を受けとるのを復活させ、さらに super の呼び出しを追加しています。 Module で initialize を定義する時の定石にそろえたのですね。

nobu:r43775 2013-11-22 12:43:56 +0900

文字列の浮動小数点数をパースする時に非常に長い文字列を読み込ませると精度的に意味のない桁まで真面目に処理してしまって非常に長い計算時間がかかっていたので適度なところで打ち切るようにしています。これは String#to_f などで数値化する時に長い文字列を渡すことで CPU 時間を食い潰すので JSON のパースなど Web アプリケーションでパラメータとして受け取った文字列を Float としてパースしようとするケースで DoS 攻撃のターゲットとなり得ることから脆弱性の対策としてコミットされました。より一般的には http サーバやフレームワークでパラメータの長さを制限するなどの対策も考えられます。
このコミットを受けて 2.0.0-p353 および 1.9.3-p484 がリリースされました。

nobu:r43780 2013-11-22 13:10:46 +0900

r43775 の変更で精度が足りていなくて BigMath のテストが失敗していたので読む桁数を増やしています。

naruse:r43787 2013-11-22 14:16:54 +0900

拡張ライブラリ nkfnkf の最新版 2.1.3 をマージしています。主に ESC 文字を変換時に削除するようにする変更が入っているみたいです。

nobu:r43788 2013-11-22 14:21:06 +0900

r43787 の行末の空白を除去しています。

mrkn:r43789 2013-11-22 14:50:34 +0900

ext/bigdecimal/bigdecimal.c のインデント修正のみ。

mrkn:r43790 2013-11-22 14:54:05 +0900

ext/bigdecimal/bigdecimal.c で RB_GC_GUARD() による変数のコンパイラ最適化避けを関数の末尾や return の直前など利用している箇所より後に置くように移動しています。

mrkn:r43791 2013-11-22 14:55:45 +0900

BigMath.exp の実装で計算のループの中で rb_thread_check_ints() を読んで例外やシグナルなどの割り込みが効くようにしています。 ここで割り込めるようにするということはループ内で ObjectSpace で管理されていないメモリ確保などが行なわれていないことが条件になると思いますが、ぱっと見た感じ大丈夫そうですね。

nobu:r43792 2013-11-22 15:32:34 +0900

test/ruby/test_string.rb の assert を使っていたところをより有用なメッセージが出るように各種 assertion メソッドを使うように書き直しています。

naruse:r43793 2013-11-22 15:38:51 +0900

NEWS ファイルの拡張ライブラリ objspace で追加されたメソッド群についてを compatibility issue の節から新機能の節に移動、また RubyGems と RDoc のバージョンを preview2 に更新しています。

nari:r43794 2013-11-22 16:26:55 +0900

rb_gc_set_params() という GC のパラメータを設定する関数が intern.h で公開されていたのですが、これは internal で利用するためのものなので deprecate としてマークしています。rb_gc_set_params() は ruby_gc_set_params() と改名して元の名前の関数を別名として定義するようにして、internal.h に ruby_gc_set_params() のプロトタイプ宣言を追加して内部からはこちらを利用するように変更しています。

ko1:r43795 2013-11-22 16:40:27 +0900

GC のパラメータを制御する環境変数のひとつ page あたりの slot 数の下限を指定する RUBY_HEAP_MIN_SLOTS が有効に効かずに page の追加がされるパスがあったので heap_set_increment() に引数を追加しています。 この引数を 0 で呼んでいる箇所はいいんでしょうか? [ruby-core:58474] [Bug #9137]

mrkn:r43796 2013-11-22 16:52:17 +0900

拡張ライブラリ bigdecimalBigDecimal#power で第2引数で精度が指定された時にもその精度への丸めが行なわれていなかった不具合を修正しています。 [ruby-core:56802] [Bug #8818]

nobu:r43797 2013-11-22 16:56:29 +0900

r43794 で rb_gc_set_params() を別名として定義するために RUBY_ALIAS_FUNCTION_VOID() というマクロを利用していたところで関数の引数部分を (void) としていたのですが、このマクロは関数定義ではなくて関数呼び出しとして展開されるので無引数の時は () でないといけなかったので修正しています。このマクロなんかあんまり楽できてる気がしないですね…。普通にラッパ書いてもそんなに変わらないような気も。

mrkn:r43798 2013-11-22 17:05:58 +0900

r43463 で導入された T_TYPEDDATA でデータ解放処理を遅延させずにすぐ解放するように指定するフラグ RUBY_TYPED_FREE_IMMEDIATELY を拡張ライブラリ bigdecimal でもセットしていたのを、利用可能かどうかチェックして使うようにしています。 bigdecimal は gem パッケージとして作られているので古い ruby と一緒にインストールされる可能性も考慮しているのだと思います。

mrkn:r43799 2013-11-22 17:07:43 +0900

拡張ライブラリ bigdecimal の gemspec ファイルのバージョンを 1.2.2 に更新しています。

nari:r43800 2013-11-22 17:16:55 +0900

GC の実施回数を取得する rb_gc_count() の宣言を internal.h から include/ruby/intern.h に移動して公開 API にしています。

kazu:r43801 2013-11-22 17:22:34 +0900

r43795 の ChangeLog エントリの typo 修正。

naruse:r43802 2013-11-22 17:50:14 +0900

Rails で HTTP パラメータをパースするところで binary (ASCII-8BIT) の文字列を default_internal を UTF-8 に設定して encode すると readbyte の結果が変化するという 2.0.0 からの変化があるそうで画像などバイナリデータが壊れるという問題があるそうです。バイナリデータを encode しているのでまあ変化するのは当然ではあるのですが、workaround として encode で :replace オプションを明示的に指定しない時には変換先のエンコーディングにとって不正なバイト列も変更しないでそのまま通すようにしています。

mrkn:r43803 2013-11-22 22:31:26 +0900

r43796 の bigdecimal の変更で BigDecimal#power の第2引数が指定されなかった時も丸めようとしてエラーになってしまっていたので省略時は丸め処理をスキップするようにしています。