ruby-trunk-changes 2019-10-10

今日は昨日の整数オーバーフロー考慮したメモリ確保関数から安全に例外発生できるようにする修正や numbered parameter のスコープチェックの不具合修正、openssl の内部オブジェクトの GC 関連の潜在的不具合修正などがありました。

[b9cf58d2b2] Yusuke Endoh 2019-10-09 13:57:19 UTC

signal.c の ruby_abort() 関数の定義を sigill() 関数の後ろに移動しています。 sigbus() と sigill() の間に割り込むように置かれてたので類似の関数をまとめるために移動したとのこと。

[dd477df411] Yusuke Endoh 2019-10-09 14:02:22 UTC

error.c の rb_bug_context() を rb_bug_for_fatal_signal() に改名しています。

[891cbd66a4] Yusuke Endoh 2019-10-09 14:13:59 UTC

dd477df411691803fc5a83c7daa64faac112a0e4 の続きで改名した rb_bug_for_fatal_signal() の引数にシグナルハンドラの関数ポインタを渡せるようにして SIGSEGV, SIGBUS, SIGILL などのシグナル受信時の処理でデフォルトでセットされているシグナルハンドラも呼ぶようにしています。環境によっては(Android では?)元々これらのシグナルに対してハンドラがセットされていることがあるようです。

[29e6782f5d] Nobuyoshi Nakada 2019-10-09 14:39:58 UTC

891cbd66a411725d7300a28b1a95619c2902f0eb のさらに続きで rb_bug_for_fatal_signal() の第1引数の型を vm_core.h で ruby_sighandler_t と定義しておいてこれを使うようにしています。

[bb71a128eb] Ben Woosley 2017-05-18 22:59:38 UTC

st_table のテーブルにあるキーが存在しているかどうか判定するために st_lookup() で結果を格納するポインタに 0 を渡して呼んでいたところを st_is_member() という同じ内容のマクロがあったのでこれを使うようにリファクタリングしています。

[9b919885a0] 卜部昌平 2019-10-09 15:10:14 UTC

7e0ae1698d4db0baec858a46de8d1ae875360cf5 の rb_xmalloc_mul_add_mul() という関数導入時に変数代入の間違いがあったのを修正しています。

[ecf6c0402e] git 2019-10-09 15:14:36 UTC

version.h の日付更新

[8dc5fe6e89] Alan Wu 2019-10-09 15:34:03 UTC

class.c の rb_define_module_id() という関数で不要なローカル変数を使うのをやめるリファクタリング

[42edb05626] Nobuyoshi Nakada 2019-10-09 16:08:42 UTC

vm_insnhelper.c の vm_declare_class() と vm_declare_module() からクラス名設定のため名前の文字列を生成して定数に設定する処理を declare_under() という関数に切り出すリファクタリング

[25100c4697] Nobuyoshi Nakada 2019-10-09 23:53:46 UTC

後置 in 記法によるパターンマッチで in の左辺(って言うのかな)の式について value_expr() を呼んで値を返す式になってるかチェック(return とか break とかの処理フローを制御するのはダメとか)するようにしています。

[9c3153e0da] 卜部昌平 2019-10-10 02:55:43 UTC

rb_raise() を GVL を外したスレッドからも呼べるように、持ってなかったら GVL を確保してから処理するようにしています。メモリ確保の関数内から呼ぶためらしい。

[a23b639050] Nobuyoshi Nakada 2019-10-10 05:07:27 UTC

negative_size_allocation_error() の宣言に NORETURN() をつけています。

[c2065c64cb] Nobuyoshi Nakada 2019-10-10 04:50:13 UTC

numbered parameter のスコープの情報を保持するのを struct parser_params に直接保存していたのを struct local_vars に移動してローカル変数のスコープ毎に管理するようにしています。ブロック内でメソッド定義したりした時にその中のブロックにローカル変数のスコープが分かれている外側のブロックでの numbered parameter の利用が影響してしまっていたのを修正しています。 [ruby-core:95294] [Bug #16248]

[495ebd6e95] Nobuyoshi Nakada 2019-10-10 05:21:29 UTC

common.mk の error.o の依存関係に thread.h を追加しています。 9c3153e0da991e1a7df9b4cf91d6830effc79b22 の変更で必要になったのが漏れてたようです。

[717b72a8af] Jean Boussier 2019-10-01 11:16:32 UTC

rubygems の Gem::Package::TarReader で IO に seek を呼ぶ前に respond_to? でチェックするようにしています。毎回呼んでみて例外を rescue してたのが遅いのでそれを回避するようにしています。

[dc2b301994] Nobuyoshi Nakada 2019-10-06 15:08:32 UTC

6dfe0c9dcd8327dfce5f689d6a184c0f3a146a24 で rubygems のテストで日付のチェックを緩めてたのをもう少し厳密なチェックをするようにしています。

[6f522455bf] Nobuyoshi Nakada 2019-10-06 15:12:18 UTC

rubygems のテストで日付をチェックするテストで専用の assertion メソッドを追加して厳密なチェックでなく範囲をもたせたチェックにするようにしています。

[203b7fa1ae] Nobuyoshi Nakada 2019-10-10 07:08:39 UTC

拡張ライブラリ openssl で ASN1 のタグ名? を管理する Hash オブジェクトを rb_global_variable() で GC の root にするのを、実際にオブジェクトを代入する前にやっておくようにしています。すぐに呼んでたから大丈夫かなと思ったけど rb_global_variable() 自体が中で ALLOC() を呼んでるのでそこで GC が走る可能性があるんですね。 [ruby-core:95179] [Bug #16196]

[0b26f56a77] Kazuhiro NISHIYAMA 2019-10-10 07:48:26 UTC

6f11c3b3354bef107f894f112ff7698414c7bae5 で GitHub Actions の job level if で [ci skip] がコミットログに含まれてたらテストをスキップするようになったので、各ステップ毎に書いてた if は削除しています。

[d96f04d73a] 卜部昌平 2019-10-10 07:10:58 UTC

9c3153e0da991e1a7df9b4cf91d6830effc79b22 で Ruby の Thread じゃないところで rb_raise() が呼ばれてた時の abort(3) での異常終了時に "[FATAL] " というメッセージを標準エラー出力に表示するようにしています。 rb_fatal() した時と極力同じにするためかな。

[f1ce4897f2] 卜部昌平 2019-10-10 08:04:59 UTC

9c3153e0da991e1a7df9b4cf91d6830effc79b22 の rb_raise() を GVL 解放した状態で呼べるようにする変更は一部 revert して、かわりに gc_raise() という関数を導入してこちらは GVL なしで呼ぶと中で GVL 確保するようにしています。ささださんからのリクエストとのこと。

[2d393bf125] 卜部昌平 2019-10-10 08:49:31 UTC

rb_fatal() に GVL を保持しているかをチェックして確保してなかったら fprintf(3) と abort(3) を使った簡易的な実装にきりかえるようにしています。

[3f413896c3] 卜部昌平 2019-10-10 09:15:33 UTC

f1ce4897f2eaf9a99c250e4707e3ab6f6bdacb74 で一部 revert したために不要になった "ruby/thread.h" の include を error.c から削除しています。

[0131fab749] Nobuyoshi Nakada 2019-10-10 10:56:51 UTC

203b7fa1ae8cc40d41c38d684f70b3fea7fae813 で追加した GC.stress = true するテストは時間がかかりすぎるからということで skip 状態でしたが起動後に GC.stress = true を実行するようにするのと、require に "openssl.so" を直接指定することで時間を削減して実行するようにしています。 [ruby-core:95179] [Bug #16196]

[9c0cd5c569] Nobuyoshi Nakada 2019-10-10 10:38:37 UTC

203b7fa1ae8cc40d41c38d684f70b3fea7fae813 の再修正。 openssl が内部的に使っている変数を GC の mark 対象にするのに rb_global_variable() を使っていたのを rb_gc_register_mark_object() を使うようにしてオブジェクト確保後に呼ぶようにしています。変数のアドレスを直接 root にするんじゃなくてオブジェクトを mark 用配列に入れるのでこちらのほうがちょっとスマート。 [ruby-core:95179] [Bug #16196]