ruby-trunk-changes r55076 - r55091

今日は Solaris Studio でのビルド修正や OpenSSL のパスワード付き PEM の読み書き時の password のチェック強化などがありました。

sorah: r55076 2016-05-20 02:21:29 +0900

NEWS ファイルの MatchData#values_at についての記述でチケット参照の前に空白を挿入しています。

svn: r55077 2016-05-20 02:21:30 +0900

version.h の日付更新。

rhe: r55078 2016-05-20 13:36:03 +0900

拡張ライブラリ openssl のテストで OpenSSL::SSL::Session#timeout のチェックを削っています。デフォルトの timeout の値は根拠のあるものでなくバージョンによって変化しうるようです。 参考URL: https://tools.ietf.org/html/rfc2246#appendix-F.1.4 https://git.openssl.org/?p=openssl.git;a=blob;f=ssl/t1_lib.c;h=dd5bd0050d89f5585c1b06a227eb8221ebf984f1;hb=5dd94f1847c744929a3bd24819f1c99644bb18c7#l193

nobu: r55079 2016-05-20 19:48:51 +0900

Enumerable#min, #max, #minmax などが生成する Enumerator のために T_IMEMO を使って配列を確保しているところで NEW_MEMO_FOR() のかわりに NEW_CMP_OPT_MEMO() というマクロを追加して、配列のバッファ内に詰める VALUE でないメンバのオフセットも渡して、RArray の len を VALUE の値が入っている部分だけにしています。 capa は全体が入るようにしているので、バッファ内には乗っているけど VALUE でない値が mark されることを防いでいます。なるほどー。 RGENGC_CHECK_MODE=2 でビルドした時の abort を解消しているそうです。

nobu: r55080 2016-05-20 20:47:16 +0900

拡張ライブラリ win32ole で RSTRING_LEN() が LONG_MAX 以上の時の例外を削っています。

nobu: r55081 2016-05-20 21:17:14 +0900

拡張ライブラリ win32ole で method_missing の実装で ole_propertyput() や ole_invoke() に渡す文字列オブジェクトを新規に作成するのではなく rb_str_dup() や rb_str_subseq() を使ってバッファを共有する文字列オブジェクトを使うようにして最適化しています。

ngoto: r55082 2016-05-20 21:29:06 +0900

r54986 の __builtin_constant_p() の利用部分の #ifdef を修正した時に Solaris10 上の Oracle Solaris Studio でのビルドがエラーになったのを修正。 __builtin_constant_p() はあるのだけど __extension__ という拡張に対応していないので、include/ruby/defines.h で RB_GNUC_EXTENSION や RB_GNUC_EXTENSION_BLOCK() というマクロを定義して、これを使うようにしています。 [ruby-dev:49629] [Bug #12397]

kazu: r55083 2016-05-20 22:21:55 +0900

拡張ライブラリ date の rdoc 用コメントの typo 修正。 https://github.com/ruby/ruby/pull/1360

ngoto: r55084 2016-05-20 22:33:10 +0900

r55082 の続き。 symbol.h でも __extension__ を RB_GNUC_EXTENSION_BLOCK を使うようにして、また __builtin_constant_p() を使っている部分を #ifdef __GNUC__ のかわりに #ifdef HAVE_BUILTIN___BUILTIN_CONSTANT_P を使うようにしています。

nobu: r55085 2016-05-20 23:24:39 +0900

thread_pthread.c の gvl_atfork() を #if defined(HAVE_WORKING_FORK) で括っています。同じ条件の部分でしか呼び出されていないため。

ngoto: r55086 2016-05-20 23:55:23 +0900

id_table のテーブルのバッファ確保する時に SPARC のメモリアライメントの制約にひっかかるのを修正しています。とりあえず ID が 4 byte で VALUE が 8 byte という想定で、バッファサイズを偶数に切り上げるようにしています。 あれ、これサイズを調節するだけでいいのかな。padding して配置も調整しないとアクセスする時にも問題になりそうだけど。 [ruby-dev:49631] [Bug #12406]

rhe: r55087 2016-05-21 00:05:25 +0900

拡張ライブラリ openssl の OpenSSL::PKey でパスワードつきの PEM から読む時に渡す password の扱いを修正しています。この文字列には OpenSSL 側で受け付けるサイズの制限があり(短すぎるのもだめらしい)、また NUL 文字を含めることができないので、ossl_pem_passwd_value() という関数を導入してサイズチェックするようにしています。ossl_pem_passwd_cb() でサイズも返しているところをみると NUL 文字は入ってたらだめだけど NUL 終端である必要はないんでしょうね(StringValueCStr() を使う必要はない)。なんかちょっと不思議ですね。あと NUL 文字が入ってるとダメなのはチェックしていないような気が。テストをみるとそれはわざとなのか。 NUL 文字を考慮してサイズチェックする必要はないんですかね? つまり "ab\0c" は len は 4 ですが NUL 終端された文字列としてみると 2 なので、これは OpenSSL は弾くのかどうか、という。 https://github.com/ruby/openssl/issues/51

svn: r55088 2016-05-21 00:05:26 +0900

version.h の日付更新。

nobu: r55089 2016-05-21 00:29:41 +0900

r55087 の ossl_pem_passwd_cb() で int 型の変数に代入する時の文字列の長さを RSTRING_LENINT() で取るようにしてコンパイラ警告を抑制するようにしています。

nobu: r55090 2016-05-21 00:30:29 +0900

io.c の pipe_atexit() は Windows 環境だけで利用されていて、rb_execarg_fixup_v() は fork() や spawnv() が使える環境のみで呼ばれているので、それぞれ #if で括っています。

nobu: r55091 2016-05-21 00:36:34 +0900

fork() も spawnv() もない環境(Windows? )で rb_execarg_commandline() という関数を定義してコマンドライン文字列の組み立てにこれを使うようにしています。またこの条件のときだけ利用されていた rb_spawn_process() のローカル変数の宣言がなかったので追加しています。 [ruby-core:75611] [Bug #12398]