ruby-trunk-changes r47383 - r47412

今日は rdoc が 4.2.0.alpha に更新されました。また Dir#fileno メソッドの追加のほか、昨日の vfork(2) 利用の関係で権限変更のチェックやシグナルハンドラの子プロセスでのリセットなどがありました。

hsbt: r47383 2014-09-04 20:09:32 +0900

Symbian は 2013年に最後の端末が出荷されてもうサポートも打ち切られているそうで(参考URL: http://symbian.nokia.com/ )、rubySymbian サポートを削除しています。 [ruby-core:64725] [Feature #10199]

hsbt: r47384 2014-09-04 20:11:12 +0900

r47383 の Symbian サポート削除の残り。 symbian/ ディレクトリを削除しています。 多分 git-svn からだと空ディレクトリの扱いが微妙なので残ってしまってたのかな。

hsbt: r47385 2014-09-04 20:22:20 +0900

拡張ライブラリ pathname の Pathname#mountpoint のテストを追加しています。こんなメソッドもあるのか。 https://github.com/ruby/ruby/pull/709

akr: r47386 2014-09-04 23:56:03 +0900

r47363 で system や spawn で fork(2) のかわりに vfork(2) を使うようにして高速化していましたが、seteuid(2) や setguid(2) などで権限を変更して実行しているプロセスでは vfork() を使わないようにしています。 issetugid(2) というシステムコールがあればこれを使って、なければ getresuid()/geteuid()/getuid() などを使って euid/egid や ruid/rgid が変更されていないかをチェックするようにしています。 vfork() で作られた子プロセスは メモリ空間を親プロセスと共有するので、その関係でやめているのだと思いますが、一般的にどういう問題があるのかわちょっと調べきれませんでした。

akr: r47387 2014-09-05 00:54:04 +0900

Dir#fileno というメソッドを追加して Dir オブジェクトの dirent の fd を取得できるようにしています。どう使うのかなーと思ったらテストで fd leak チェックのために欲しい機能ということでした。なるほど。 [ruby-dev:48265] [Feature #9880]

svn: r47388 2014-09-05 00:54:13 +0900

version.h の日付更新。

akr: r47389 2014-09-05 01:41:12 +0900

NEWS に spawn などで vfork(2) を使うようになったことを追記しています。

normal: r47390 2014-09-05 06:05:31 +0900

vm.c の USE_THREAD_RECYCLE マクロで条件コンパイルしていたところを削除しています。既にマクロを有効にしても使われていない状態だったので綺麗にしています。 [ruby-core:64718] [Feature #10198]

hsbt: r47391 2014-09-05 10:41:25 +0900

標準添付ライブラリの rdoc を 4.1.0 から 4.2.0.alpha に更新しています。 2.2 のリリースに向けて upstream のあるライブラリ(rubygems や rake、psych、json など)はそろそろ更新されるころですかね。 差分が大きいので細かく読んでいませんが変更点などは本家リポジトリHistory.rdoc を参照してください。 https://github.com/rdoc/rdoc/blob/master/History.rdoc
言語化(翻訳)のための pot ファイルの生成機能などが目玉新機能みたいです。

hsbt: r47392 2014-09-05 10:41:28 +0900

r47391 の rdoc の更新でテストの typo があったのを修正しています。

svn: r47393 2014-09-05 10:41:44 +0900

r47391 の rdoc 更新で行末の空白を除去しています。

svn: r47394 2014-09-05 10:41:46 +0900

r47391 の rdoc 更新で新規追加されたファイルの svn property を設定しています。

hsbt: r47395 2014-09-05 11:10:17 +0900

r47391 の rdoc 更新で追加されたテストで必要だった行末の空白を r47393 で bot が削ってしまったためにテストが失敗していたので比較対象も修正しています。行末空白除去で誤爆することあるんじゃないかなーと思ってましたがこういうケースがありましたか。

akr: r47396 2014-09-05 12:28:53 +0900

r47386 の vfork(2) 利用の判定のための権限変更をチェックするための getuid()/geteuid()、getgui()/getugid() の結果をブロック内で新たに宣言した変数に代入してしまっていたので、外のスコープの変数に代入するように修正しています。

akr: r47397 2014-09-05 12:43:28 +0900

r47386 の権限チェックの実装で getresuid()/getresgid() の実装を AIX では getuidx() と getgidx() というシステムコールを利用して実装するようにしています。

akr: r47398 2014-09-05 12:58:42 +0900

r47386 で追加した has_privilege() を修正。 euid/egid との比較で検出するようにしています。実効IDが root だったり実IDと異なっていたら権限が変更されている(root は特別扱いでしょうね)と判定し、また実効IDが保存(復帰)IDと異なっていた時も変更されている(修正前は 実IDと保存(復帰)ID を比較していましたが、保存IDは実IDと同じはずなので…あれ? この実IDと保存IDの比較の判定 uid と gid で結果が反対ですね。これはいいのかな…。と思ってたら r47409 で gid のほうが修正されていました。

hsbt: r47406 2014-09-05 18:34:38 +0900

標準添付ライブラリ csvCSV::Row や CSV::Table のテストメソッドをいくつか追加しています。 https://github.com/ruby/ruby/pull/710

hsbt: r47407 2014-09-05 18:37:24 +0900

r47406 の ChangeLog エントリに GitHub の pull request の参照を追加しています。 https://github.com/ruby/ruby/pull/710

hsbt: r47408 2014-09-05 19:00:46 +0900

標準添付ライブラリ shellwords の rdoc 用コメントの文法修正です。 [ruby-core:64471] [Bug #10155]

akr: r47409 2014-09-05 20:36:19 +0900

r47386 および r47398 での has_privilege() の戻り値が反転していた不具合の修正。

akr: r47410 2014-09-05 20:49:04 +0900

process.c の handle_fork_error() で呼び出し元に rb_protect() が返す state を返す必要がなくなっていたため state_p 引数を削除してローカル変数 state を使うようにリファクタリングしています。

akr: r47411 2014-09-05 21:03:54 +0900

process.c の handle_fork_error() で try_gc という変数の宣言に volatile 修飾子を追加しています。 コンパイラの "clobbered by 'longjmp' or 'vfork'" 警告を抑制するためとのこと。 rb_jump_tag() を呼んでいるからかと思いましたが rb_jump_tag() は eval.c で関数として定義されているから展開されないし、はて、どこで警告が出るんだろう。 handle_fork_error() が inline に展開された時に、呼び元の vfork() があるからかも。

akr: r47412 2014-09-05 21:46:09 +0900

process.c にさらに fork 時の処理として disable_child_handler_before_fork()、disable_child_handler_fork_parent()、disable_child_handler_fork_child() などの関数を追加して、fork(2) や vfork(2) で作った子プロセスでシグナルハンドラの設定を SIG_DFL にリセットするようにしています。 しかしその前に割り込まれてしまわないように fork()/vfork() の瞬間にシグナルをマスクしておくようにしています。 fork 前にマスクしておかないと子プロセスでリセットする処理の前に割り込まれる可能性があるので、親プロセスでマスクしてから fork し、親ではすぐ元に戻して、子プロセスではシグナルハンドラのリセット後にマスクを外すようにしています。