ruby-trunk-changes r56146 - r56157

今日は主に string.c での文字列サイズや capacity の計算での整数の overflow チェックの強化がありました。

naruse: r56146 2016-09-13 06:04:25 +0900

make benchmark, benchmark-each, tbench などのターゲットで rubyコマンドラインオプション -I に渡すライブラリのパスがずれていたので修正しています。

rhe: r56147 2016-09-13 14:59:53 +0900

拡張ライブラリ openssl の OpenSSL::SSL::SSLContext#options のテストが Ubuntu 16.04 で失敗するので pend を使って回避しています。 Ubuntu 16.04 で OpenSSL にパッチが当てられて SSL_CTX_set_options() の挙動が変わっているみたいです。

rhe: r56148 2016-09-13 16:08:15 +0900

r55692 とかそのあたりで String オブジェクトのバッファ管理で capa に含める終端文字のバイト数 termlen を 1固定でなくエンコーディングに従って調整するようにしたので、rb_str_set_len() でのチェックが過剰になって不要な rb_bug() の呼び出しが発生してしまう不具合を修正しています。 [ruby-core:77257] [Bug #12757]

nobu: r56149 2016-09-13 17:12:54 +0900

rb_str_change_terminator_length() での文字列の長さが capacity を超えないかどうかのチェックで len に termlen の差分を足してチェックしているのを capa - len と termlen の差分の比較にして、文字列が非常に長い時に overflow しないように修正しています。

ko1: r56150 2016-09-13 18:39:08 +0900

r56125 の Thread#raise で別の Thread に例外を投げた時の cause のセットについての修正のテストで Thread 間の動機のためにローカル変数と Thread.pass で同期を取っていたのを Queue を使うようにしています。また Thread#join で終了を待つようにしています。

nobu: r56151 2016-09-13 21:11:57 +0900

string.c に文字列のサイズが struct RVALUE にバッファを埋め込めるかどうかのチェックをしているところを STR_EMBEDABLE_P() というマクロに切り出して、r56149 と同様に len が非常に大きい時に overflow しないように比較方法を修正しています。

kazu: r56152 2016-09-13 21:26:01 +0900

r56139 の ChangeLog エントリのクオートがひとつ余分だったのを削っています。

kazu: r56153 2016-09-13 21:26:03 +0900

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

kazu: r56154 2016-09-13 21:26:04 +0900

README.md と README.ja.md のサポートしているプラットフォームについての記述から BeOS は削除し、かわりに Haiku を追加しています。

rhe: r56155 2016-09-13 21:28:54 +0900

r56151 で導入したマクロ STR_EMBEDABLE_P() は STR_EMBEDDABLE_P() に改名(D は2つ)して、さらに他にも同様のチェックをしているところがあったので利用箇所を増やしています。

rhe: r56156 2016-09-13 21:33:13 +0900

size_t 型の変数をフォーマットする時に指示子に PRIdSIZE を使っていたのを PRIuSIZE にして unsigned として解釈させるようにして、非常に大きな数値の時に負の値が表示されるのを修正しています。

rhe: r56157 2016-09-13 21:33:16 +0900

strinc.c で整数の overflow 対策で termlen の加算前に size_t にキャストしたり、また rb_str_plus() や rb_str_modify_expand() などで overflow チェックがされてなかったのを追加したりしています。