ruby-trunk-changes r55207 - r55224

今日は Addrinfo が NUL 終端していない文字列でうまく動かない(現状は表面化しない)不具合の修正や、拡張ライブラリ openssl の ECDH の鍵の指定方法の変更などがありました。

nobu: r55207 2016-05-30 14:18:16 +0900

variable.c の check_autoload_required() の feature の文字列サイズのチェックで RSTRING_LEN() をみるべきところ RSTRING_PTR() をみていたのを修正しています。

nobu: r55208 2016-05-30 14:41:02 +0900

String#[ ] と String#byteslice で引数の評価の順序を固定するために rb_str_substr() の引数にそのまま NUM2LONG() を渡していたのを一旦ローカル変数に受けてから渡すようにしています。

nobu: r55209 2016-05-30 14:50:27 +0900

rb_str_substr() から str_substr() という関数を切り出し、というかほぼ完全にコピーして、引数 empty を追加してこれが偽の時には結果が空の文字列になる時には文字列オブジェクトを作らずに Qnil を返すようにして内部的にはこちらを利用して不要なオブジェクト生成を抑制するようにしています。

nobu: r55210 2016-05-30 14:54:59 +0900

拡張ライブラリ stringio で StringIO から読み込む時に内部のバッファの文字列から部分文字列を常に新しく生成するのではなく rb_str_subseq() を使って可能なら(現状だと文字列末尾の場合)バッファを共有するようにしています。

nobu: r55211 2016-05-30 15:12:13 +0900

拡張ライブラリ socket の Addrinfo のテストに "" と "" という特殊なホスト名(それぞれ "0.0.0.0" と "255.255.255.255" になる)についてのテストを追加しています。

nobu: r55212 2016-05-30 16:20:28 +0900

str_fill_term() で引数の文字列先頭ポインタではなく、拡張したり複製したりした新しい文字列バッファを返すように修正しています。これは不具合修正かな?

nobu: r55213 2016-05-30 16:28:55 +0900

現状では部分文字列は文字列の末尾のみ共有できるようになっていて、これは String オブジェクトのバッファは拡張ライブラリの互換性のために NUL 文字終端するようにしているからなのですが、SHARABLE_MIDDLE_SUBSTRING というマクロを 1 にすると、文字列の途中も共有可能にして NUL 終端しないようにするのですが、そうすると拡張ライブラリ socket の Addrinfo で strcmp(3) や strlen(3) を使っていてうまく動かないところがあったので修正しています。

rhe: r55214 2016-05-30 18:30:38 +0900

拡張ライブラリ openssl の OpenSSL::SSL::SSLContext の #tmp_ecdh_callback= は deprecate にして、利用すると警告が出るようにしています。 OpenSSL の SSL_CTX_set_tmp_ecdh_callback() という関数自体が削除される予定なんだそうです。2.3 から入った機能だったので短い命だった。 ECDH では SSL_CTX_set_ecdh_auto() を使って自動的にサーバとクライアントで利用できる鍵の仕様を決定するようにしています。

duerst: r55215 2016-05-30 20:00:26 +0900

String#downcase の rdoc 用コメントに省略可能な引数 :ascii/:turkic/:lithuanian/:fold について追記しています。

nobu: r55216 2016-05-30 20:23:32 +0900

r55213 で NUL 終端を期待しないように修正した Addrinfo のテストで "0001.0001.0001.0001" のような書きかたの IP アドレスで各数値が 8進数と解釈されたり10進数として解釈されたりが実装依存なので、影響を受けないように 127.0.0.1 を使ってたのを 1.0.0.1 を使うようにしています。0 で padding しているのは、 embed string にならないようにサイズを増やすためでしょうね。

duerst: r55217 2016-05-30 21:15:41 +0900

String#upcase, #upcase!, #downcase!, #capitalize, #capitalize!, #swapcase, #swapcase! の rdoc 用コメントにも省略可能な引数について追記して、 r55215 で追記した String#downcase の説明を参照させるようにしています。

usa: r55218 2016-05-30 21:51:14 +0900

r55213 および r55216 の Addrinfo のテストで 0埋めで文字列を伸長するのではなくて "127.0.0.1xxxxxxx..." と末尾に文字を付加して、この部分を base_str[0,9] で切り出して使うようにしています。この場合って結果の文字列のサイズが小さいと embed string にならないんでしたっけ。

rhe: r55219 2016-05-30 22:02:13 +0900

拡張ライブラリ openssl で時刻を表す数値を time_t 型に変換する時に NUM2LONG() ではなく NUM2TIMET() を利用するように修正しています。 [ruby-core:45552] [Bug #6571]

nobu: r55220 2016-05-30 23:05:36 +0900

拡張ライブラリ socket の Addrinfo で文字列が長過ぎる時の例外メッセージに size_t 型の値を埋め込む時に %ld ではなく PRIdSIZE を利用するようにしています。

nobu: r55221 2016-05-30 23:07:01 +0900

r55195 で File#flock のテストを強化した時に flock を呼ぶ時の open の mode を "r+" にして書き込み可能な開きかたをするようにしています。

usa: r55222 2016-05-31 00:33:06 +0900

拡張ライブラリ socket の Addrinfo で渡された文字列に NUL 文字が途中に含まれていた場合を考慮して StringValueCStr() を使って NUL までの文字列を切り出して使うように修正しています。

svn: r55223 2016-05-31 00:33:07 +0900

version.h の日付更新。

rhe: r55224 2016-05-31 01:52:10 +0900

r55214 で追加した拡張ライブラリ openssl の OpenSSL::SSL::SSLContext#ecdh_curves= のテストで渡す curve のリストを変更しています。 RHEL だと P-224 という種類は利用できないそうです。