ruby-trunk-changes r38147 - r38165

今日は BigDecimal.new に tainted な文字列を渡した時の挙動の変更や Thread#backtrace などが不正な引数で SEGV していた不具合修正などがありました。

mrkn:r38147 2012-12-03 00:09:49 +0900

BigDecimal.new で文字列を BigDecimal に変換する時に taint されていると $SAFE が1以上の時に SecurityError が発生していたのですが、文字列の整数化は to_i などでは $SAFE チェックされていないので BigDecimal でもチェックを外しています。 [ruby-core:40510] [Bug #5508]

svn:r38148 2012-12-03 00:09:54 +0900

version.h の日付更新。

drbrain:r38149 2012-12-03 07:52:57 +0900

r38135 で追加した rdoc が1行目の modeline を解釈するようにした昨日のモードラインの判定に複数の変数が記述されている場合を許容するなどもう少し柔軟な表記に対応するようにしています。

nobu:r38150 2012-12-03 12:43:40 +0900

Emacs 用の ruby-mode.el のインデントを揃える機能の修正などが入ったようです。 [ruby-core:38684] [Bug #5140]

ko1:r38151 2012-12-03 14:14:50 +0900

YARV (今は単に Ruby VM と呼べばいいんでしょうか)の命令には Joke 命令として bitblt と answer という実際には利用されない命令が SUPPORT_JOKE という条件コンパイル付きで存在しているのですが、これを利用するためのメソッドのシンボルを id.h に置いていたのをやめて rb_intern() でその場で作るようにしています。これは性能とか気にするようなところではないので、ヘッダの依存関係を切るために他のシンボルたちとは逆向きの変更をしたみたいです。

knu:r38152 2012-12-03 15:52:47 +0900

misc/ruby-additional.el で set を setq に修正しています。

knu:r38153 2012-12-03 15:58:29 +0900

ChangeLog の日付の表記で日が1桁の時に0を10の桁に埋めないように表記を修正しています。 r35549, r35567, r35951, r36652, r37094, r38151 の ChangeLog エントリを修正しています。

ko1:r38154 2012-12-03 16:23:57 +0900

Thread#backtrace や backtrace_location で第2引数に負の数を指定すると SEGV していたのでチェックして ArgumentError を発生させるようにしています。

nobu:r38155 2012-12-03 18:25:19 +0900

id.h のテンプレートで "empty?" というメソッドは ID だけでなくトークンも生成していましたが "empty?" は attribute name じゃないからということで ID のみ生成するようにしています。ところで attribute name というのはどういう意味なんでしょう。他の succ とか size は特別命令にコンパイルされるメソッドたちで、empty? も r37036 で特別命令が追加された時に入ってるので、これは動かさないほうがいいんじゃないかと思うのですが。
「 "attribute name"といってるのは、=をつけてsetter名にできる名前のこと」というので "empty?" は preserved_ids に移動して良かったようです。

ko1:r38156 2012-12-03 19:03:25 +0900

ISeq の iseq_catch_table_entry::type に格納する enum catch_type は内部で配列オブジェクトに格納されるため、整数値をそのままではなくて INT2FIX() で Fixnum にしています。こうしておかないと、ObjectSpace でその配列オブジェクトに触ったときに不正なオブジェクトとして見えてしまう(VALUE 型で == 4 というのは 64bit 環境でありえない値)という問題があったそうです。 [ruby-dev:46695] [Bug #7502]

nobu:r38157 2012-12-03 19:10:14 +0900

Random, Rational でも marshal_dump, marshal_load を private メソッドとして定義するように変更しています。 [ruby-core:45395] [Feature #6539]

nobu:r38158 2012-12-03 19:21:46 +0900

オブジェクトの複製する Object#clone の実装である rb_obj_clone() で struct RBasic::flags の FL_TAINT と FL_UNTRUST が allocate した段階で立っていたら保持するビット操作を一度にまとめるようにしようとしています。とは思うのですが、ここで FL_TAINT と FL_UNTRUST を操作する意味はあるんでしょうか。 allocate 直後は普通これらのビットは 0 なんじゃないかというのと、 すぐ後の init_copy() ですぐに FL_TAINT と FL_UNTRUST はコピー元の obj の flags からコピーされると思います。

nobu:r38159 2012-12-03 19:22:15 +0900

rb_method_call() で $SAFE の最大値(4)をコード内に直に記述していたのでコメントをつけて変数として宣言してそれを使うようにしています。 定数マクロは safe.c では SAFE_LEVEL_MAX として定義されているのですが、ソースファイルに直接書かれてるので他のソースからは使えないんですね。しかし他にも array.c hash.c などなどあちこちに同じような rb_safe_level() < 4 というコードがあるので、ヘッダにもっていくかチェックそのものをマクロ化するのがよさそうですね。

ko1:r38160 2012-12-03 20:00:37 +0900

vm_exec.c で定義されている vm_analysis_insn() という VM の命令の利用統計情報を収集する関数に static を付けています。この関数はマクロ VM_COLLECT_USAGE_DETAILS が定義された時だけ利用される関数で通常は定義されていません。

ko1:r38161 2012-12-03 20:02:47 +0900

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

ko1:r38162 2012-12-03 20:06:21 +0900

r38156 で追加したテストで、Array オブジェクトを ObjectSpace.each_object で全て取得して inspect を呼ぶと "can't modify frozen File" という RuntimeError が発生することがあるので rescue を追加しています。元のテストは内部的に保持されている Array に不正な値が入っていて SEGV するという問題に対するテストなので例外はかまわないのですが、inspect しているだけなのに frozen だからとエラーになるのはちょっと不思議ではありますね。

ko1:r38163 2012-12-03 20:33:09 +0900

r37258 で導入した send_simple 命令を利用する条件を緩めています。 rb_callinfo_t::flags に VM_CALL_ARGS_SKIP_SETUP のビットフラグが立っていたら send_simple を使うようにしています。元は VM_CALL_ARGS_SKIP_SETUP 以外のフラグが立っていなくて、かつブロックも渡されていないという条件だったのですがもっと広く send_simple にしても構わなかったみたいです。

ko1:r38164 2012-12-03 20:38:43 +0900

r38160 で宣言に static を付加した vm_analysis_insn() ですが VM_COLLECT_USAGE_DETAILS が真でないと定義が有効にならないのに宣言はそのままだったので、宣言にも #if VM_COLLECT_USAGE_DETAILS をつけています。

nagachika:r38165 2012-12-03 23:55:13 +0900

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