ruby-trunk-changes r39345 - r39361

今日は multiarch のビルド時のための修正、File のグループの権限チェックの処理が Mac OS X ではグループ数16個目までしかチェックしない不具合に対する修正などがありました。

nobu:r39345 2013-02-21 09:51:11 +0900

multi architecture 対応の修正。 configure で libdir_basename を Makefile の変数として定義するようにして -Wl,-rpath の指定に configure 時でなく Makefile 上で変数展開するようにしています。multiarch だと libdir_basename に arch 名がつくので変化に追随しないといけないとか、そういうことっぽいです。コミットログには -install_name というフラグにも影響するみたいに書いてあるんですけどどこが関連しているのかわかりませんでした。 [ruby-core:52395] [Bug #7874]

svn:r39346 2013-02-21 09:51:18 +0900

version.h の日付更新。

nobu:r39347 2013-02-21 12:42:25 +0900

これも multi architecture 対応関連の修正です。 r39345 とは逆に libdir_basename を Makefile で展開するのではなく configure で展開するようにしています。 そのため libdir_basename を定義する時に multiarch の影響を加えておくようにしています。 [ruby-core:52395] [Bug #7874]

nobu:r39348 2013-02-21 12:45:07 +0900

さらにもうひとつ multiarch 関係の修正。 ruby.c でロードパスの初期化を行う時に multiarch が有効だったらディレクトリツリーの遡るディレクトリ数が異なるので対応しています。 multiarch 影響範囲大きいですね。 [ruby-core:52395] [Bug #7874]

kosaki:r39349 2013-02-21 13:40:58 +0900

Mac OS X で NGROUPS というグループ(Unix のユーザ管理上の gid とかのあの group)の数を定義する定数が 16 なのに実際にはそれ以上のグループに所属することができるため、File.writable? などのファイルの権限を確認するメソッド群で誤った判定をしてしまうという不具合がありました。このコミットはその一連の対策の最初の変更で、まず NGROUPS に依存するのをやめて独自に RUBY_GROUP_MAX という定数(65536。 Linux がこの数で、これが多分最大じゃないかとのこと)を定義して使うようにしています。またついでに xmalloc() でメモリを確保していたところを ALLOCV_N() を使って内部的な String オブジェクトを使って確保するようにしています。 [ruby-core:52537] [Bug #7886]
test/ruby/test_process.rb に関係なさそうな sleep 0.1 の挿入がありますね。

kosaki:r39350 2013-02-21 13:41:11 +0900

file.c の eaccess() でファイルの権限情報を取得する時に 実効ユーザID/実効グループID が実ユーザID/実グループID とどちらも同一だった(つまりユーザ権限の変更などがなかった)ら access(3) を呼ぶようにしています。高速化のためとのこと。

kosaki:r39351 2013-02-21 13:41:23 +0900

file.c の access_internal() という今は単に access(3) を呼ぶだけになっていた関数を削除して、直接 access(3) を呼ぶようにリファクタリングしています。

kosaki:r39352 2013-02-21 13:41:39 +0900

r39349 で導入した RUBY_GROUP_MAX の定義を削除して、元々 process.c にあった RB_MAX_GROUPS を internal.h に移動してこちらを使うようにしています。 ChangeLog のファイル名の記述が少し違いますね。

kosaki:r39353 2013-02-21 13:52:38 +0900

引き続き File の権限のチェック関連の修正です。 file.c の rb_group_member() でグループのチェックをしているところで getgroups(2) を呼んでいるところは SUS によると errno == EINVAL で返ることがあるそうなのでエラーチェックをするようにしています。

kosaki:r39354 2013-02-21 14:18:38 +0900

Solaris ではシグナルハンドラ内で abort(3) を呼べないので raise(SIGTRAP) で止めるようにしています。また sigsegv() の中で sigsegv() の呼び出しがネストしているのを検出した時にメッセージを出力するために fprintf を使っていたところも write(2) を使うように変更したり、SEGV 時のシグナルハンドラ内で呼ぶ関数を async signal safe にするようにしています。 [ruby-dev:44082] [Bug #5014]

nobu:r39356 2013-02-21 16:34:53 +0900

signal.c でスタックオーバフローのチェックしている部分を sigsegv() と sigbus() それぞれに書いていたのを check_stack_overflow() という関数と CHECK_STACK_OVERFLOW() という関数マクロ*1として切り出しています。
[ruby-dev:44082] [Bug #5014] のチケットの参照が書かれていたので一応ここにも書きましたけど、この修正はこのチケットと関係するんでしょうか?

naruse:r39358 2013-02-21 17:31:45 +0900

tool/merger.rb でバックポートしようとした時に ChangeLog しか変更がなかった時になにかおかしいので警告を出して確認を促すようにしています。

naruse:r39359 2013-02-21 17:31:47 +0900

r34369 で C 言語から呼べる break を値つきで呼ぶ機能を追加した時に rb_iter_break() の不具合を結果的に修正していたのでそのテストを追加しています。
1.9.3 ではまだ拡張ライブラリから rb_iter_break() を呼ぶと SEGV する可能性があるようです。 [ruby-core:52607] [Backport #7896]

nagachika:r39360 2013-02-22 00:18:10 +0900

r39352 の ChangeLog のファイル名の typo 修正。

svn:r39361 2013-02-22 00:18:15 +0900

version.h の日付更新。

*1:sigaltstack(2) を使えるかどうかで実装を切り替えるため別途マクロが定義されています