/ 最近 .rdf 追記 設定 本棚

log[Ruby: 2009-02-23]



20090223()

[Ruby][tDiary]ruby-1.9.1不思議で困ったことが起こった

問題のコ(再掲)はこれあるハッシュのキーについて繰り返しているのにッシュにそのキーが存在しない(すべてのキーが見つからないわけではないが見つからないキーはいつでも見つからな)

categorized.keys.each do |c|
	PStore.new(cache_file(c)).transaction do |db|
		categorized.fetch(c) #=> key not found (KeyError)
		db['category'] = {} unless db.root?('category')
		db['category'].update(categorized[c])
	end
end

fetchをブロックの最初に持って行くとそこではエラーにならない

categorized.keys.each do |c|
		categorized.fetch(c) #=> O.K.
	PStore.new(cache_file(c)).transaction do |db|
		db['category'] = {} unless db.root?('category')
		db['category'].update(categorized[c])
	end
end

cache_file(c)の呼び出しが原因その中でも includeしてある ERB::Utilu()メソドが核心

categorized.keys.each do |c|
		::ERB::Util.u(c)
		categorized.fetch(c) #=> key not found (KeyError)
	PStore.new(cache_file(c)).transaction do |db|
		db['category'] = {} unless db.root?('category')
		db['category'].update(categorized[c])
	end
end

引数にした文字列のエンコングが変わってしまっている

categorized.keys.each do |c|
		enc1 = c.encoding;
		::ERB::Util.u(c)
		enc2 = c.encoding
		categorized.fetch(c) { raise "#{enc1} #{enc2} #{::ERB.version}" } #=> UTF-8 ASCII-8BIT erb.rb [2.1.0 2009-01-11] (RuntimeError)
	PStore.new(cache_file(c)).transaction do |db|
		db['category'] = {} unless db.root?('category')
		db['category'].update(categorized[c])
	end
end

ERB::Util.url_encodeの定義を見ると引数の文字列を dupした後にエンコングを変更しているにも関わらず呼び出し元に影響を与えてしまっている

    def url_encode(s)
      s.to_s.dup.force_encoding("ASCII-8BIT").gsub(/[^a-zA-Z0-9_\-.]/n) {
        sprintf("%%%02X", $&.unpack("C")[0])
      }
    end
    alias u url_encode

そんなわけだから呼び出し側(category.rb)

u( c.dup )

なんてやっても効果はなく

u( ""+c )

あるいは

u( "#{c}" )

とやって初めて今回の現象を回避することができた

これは、文字列の複製を遅らせた結果期せずしておこった現象にみえる

バグのはずなんだけどirbで再現しようと思ってもできないんだこれ


 追記@2009-08-13: 見る人が見れば修正はあっという間でした

http://redmine.ruby-lang.org/issues/show/1929

(ここに見るべき場所を見つけることもできなかった人間がひと)

* 正しくは ruby-1.9.2dev(2009-02-03)


20090215() 本文中の URL自動リンクがセミコロンで切れていたので/shjs/lang/sh_ruby.js/shjs/lang/sh_javascript.jsを修正したそこで使っていた正規表現『詳説 正規表現 第3大抵の場合うまくいくと紹介されていたものでした(CGIパラメータを ; で区切るのはいまだに異端でした)

[Ruby][tDiary] ruby-1.9.1*不思議で困ったことが起こった

この断片で理解してもらえるだろう

categorized.keys.each do |c|
	PStore.new(cache_file(c)).transaction do |db|
		categorized.fetch(c) #=> key not found (KeyError)
		db['category'] = {} unless db.root?('category')
		db['category'].update(categorized[c])
	end
end

あるハッシュのキーについて繰り返しているのにッシュにはそのキーが存在しないというこの不思議

このときc

"\xE6\x9C\xAC\xE6\x97\xA5\xE3\x81\xAE\xE8\xB3\xBC\xE5\x85\xA5" ASCII-8BIT

ッシュのキーリトとそのエンコングは

"\xE6\x9C\xAC\xE6\x97\xA5\xE3\x81\xAE\xE8\xB3\xBC\xE5\x85\xA5" ASCII-8BIT
"本" UTF-8
"マンガ" UTF-8
"雑誌" UTF-8

存在しているだろうに……

 追記@2009-02-20: 同じ目に遭っている人がいた

さくらインターネト上で tDiaryruby1.9.1-p0 で動かす - まちゅダイアリ(2009-02-19)(14:57現在日別表示が不可能な状態最新表示は可)

* 正しくは ruby-1.9.2dev(2009-02-03)

最終更: 2009-08-29T06:18+0900

[HTML][Ruby] 中途半端なメソドは提供しないのもまた親切なのでは? > URI.escape

> URI.escape("http://exmaple.com/foo bar?a=b=c;d=e#hoge#fuga")
=> "http://exmaple.com/foo%20bar?a=b=c;d=e%23hoge%23fuga"

URLをパーツに分解せずに gsub一発でエスケープ(エンコ)するなんて不可能だと思うのです。仮にそうまでしても上の例のように#CGIパラメータとして受け渡されるように%23にエンコドするべきかURLを構成する fragmentを示す記号として#のまま残すべきか判断できない(でしょう?)

できないことをできるかのように見せかけるよりできない(のでメソドを提供しない)という方が親切だと思う

JavaScriptの提供する encodeURIComponent(/?#=もエンコドするメソ)相当のメソドがあればそれで十分だと思うんだけど

 つぶやき

http://exmaple.com/foo bar/baz/

なんてのは不正な URLだからどこにも存在しないのです。スバーに表示するときに人間に読みやすいようにと上のようにデコドして表示することはあるかもしれないけれどオリジナルの正しい URLは同時に保持しておくべきで表示用の文字列からエンコドしようなんて思っちゃダメなのです。ブラウザのスバーは表示と同時に編集も可能だから話は簡単ではないけど……これまでのところFirefox(自らの責任で)よきに計らってくれています。

RFC(古いのと新しいのと二種類?)も読んでいない放言なので「できるという可能性がなきにしもあらず。


[ruby-dev:39188] Re: URI.escape_component から

 さておき、URI.escapeは独特の動きをするので、JavaScript/ECMAScript の
 escape とも encodeURI とも encodeURIComponent とも違います。

 そういえば、現在の仕様の意図をお聞きしたかったんだった
 [ruby-dev:38124]

 なお、面倒な話が出てきた時には、とりあえず akr さんが
 既に取り上げていないか調べるわけですが、やっぱり扱っているわけです。
 http://www.a-k-r.org/d/d2004_07.html
 https://www.codeblog.org/blog/akr/20070222.html

20090202() [Vista] リソース モニタのキーボドインターフェイ: P(CPU項目を展開)D(スク項目を展開)N(トワーク項目を展開)M(メモリ項目を展開)L(全て展開)Shift+P,D,N,M,L(それぞれの項目を展開折り畳み切り替)

[Ruby][tDiary] tDiary1.9系の Rubyでは 1.9.2から動くようになるの

やっぱり nobuさんがやってくれました。

requireの処理の中でーフレベルを一時的に 0 に下げる部分があってこの範囲を広げることでSecurityErrorが出ないようになっていた(3)

画像はtDiaryamazon.rbリポトリから持ってきただけの素の Ruby-1.9.2dev(2009-02-03)上で動いているところ

既に正式版がリリースされて*しまって*いる Ruby-1.9.1との違いを、先月の日記に書いた例で見ていくと

 $SAFE=1カレトリのスクリトを requireしたとき

irb192> RUBY_DESCRIPTION
=> "ruby 1.9.2dev (2009-02-03) [i386-mswin32_90]"
irb192> $SAFE=1
=> 1
irb192> require "a"
SecurityError: cannot load from insecure path - Y:/.../Desktop/a.rb
        from (irb):3:in `require'
        from (irb):3
        from C:/Program Files (x86)/ruby/bin/irb192.bat:20:in `<main>'
irb192> require "a.rb"
SecurityError: cannot load from insecure path - Y:/.../Desktop/a.rb
        from (irb):4:in `require'
        from (irb):4
        from C:/Program Files (x86)/ruby/bin/irb192.bat:20:in `<main>'
irb192>

2009-02-03版の ruby-1.9.2devでは$SAFE=1のときカレトリのスクリトを requireできないこれは $:($LOAD_PATH)に汚染されていない "." が含まれていようとrequire の引数の文字列が汚染されていなかろうとrequireできない見つけた抜け道は絶対パスで requireするか$:($LOAD_PATH)にカレトリを絶対パスで追加すること("."が含まれる場合はそれより前に追加する必要もある)

ruby-1.9.1の結果は Release Candidateのときと変わらず

irb191> RUBY_DESCRIPTION
=> "ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]"
irb191> $SAFE=1
=> 1
irb191> require "a"
SecurityError: Insecure operation - require
        from (irb):3:in `require'
        from (irb):3
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:20:in `<main>'
irb191> require "a.rb"
a.rb required.
=> true
irb191>

ruby-1.9.1では拡張子を付けてやるとカレトリのスクリトも requireできる拡張子を付けないときに requireできないのは ruby-1.9.2devも同じだが ruby-1.9.1には ruby-1.9.2devにない爆弾がある$SAFE=1のときの拡張子を付けない require添付ライブラリの requireであっても失敗したりする

irb191> $SAFE=1
=> 1
irb191> require "stringio"
SecurityError: Insecure operation - require
        from (irb):2:in `require'
        from (irb):2
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:20:in `<main>'
irb191> require "stringio.so"
=> true
irb191>

これが原因でtDiaryruby-1.9.1で動かすのは絶望的だと思っている*(ruby-1.9.1はリリースされちったしスクリトで対応できる範囲を超えているか)

この部分は SecurityErrorが出ない方向に修正されると思っていたからruby-1.9.2devで両方のパターンが SecurityErrorになったのは意外

 $SAFE=1汚染されたパスが $:($LOAD_PATH)に含まれるとき

ruby-1.9.2devでは汚染されたパスが $:($LOAD_PATH)のどの位置にあるかが重要

irb192> $SAFE=1
=> 1
irb192> $:.unshift "!tainted!".taint
=> ["!tainted!", "C:/Program Files (x86)/ruby/lib/ruby192/site_ruby/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/site_ruby/1.9.2/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby192/site_ruby", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby/1.9.2/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby", "C:/Program Files (x86)/ruby/lib/ruby192/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/1.9.2/i386-mswin32_90", "."]
irb192> require "cgi"
SecurityError: cannot load from insecure path - Y:/.../Desktop/!tainted!/cgi.rb
       from (irb):3:in `require'
       from (irb):3
       from C:/Program Files (x86)/ruby/bin/irb192.bat:20:in `<main>'
irb192> $:.push $:.shift
=> ["C:/Program Files (x86)/ruby/lib/ruby192/site_ruby/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/site_ruby/1.9.2/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby192/site_ruby", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby/1.9.2/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby", "C:/Program Files (x86)/ruby/lib/ruby192/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/1.9.2/i386-mswin32_90", ".", "!tainted!"]
irb192> require "cgi"
=> true
irb192>

ruby-1.9.2devでは$SAFE=1汚染された LOAD_PATHからスクリトを requireすることはできないが汚染されていない LOAD_PATHからスクリトを先に見つけた場合はrequireに成功するruby-1.9.1(ruby-1.8.7-p72)ではどうだったかというとより厳しくて

irb191> $SAFE=1
=> 1
irb191> $:.unshift "!tainted!".taint
=> ["!tainted!", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby/1.9.1/i386-msvcrt", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby/1.9.1/i386-msvcrt", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/i386-mswin32", "."]
irb191> require "cgi"
SecurityError: Insecure operation - require
        from (irb):3:in `require'
        from (irb):3
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:20:in `<main>'
irb191> $:.push $:.shift
=> ["C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby/1.9.1/i386-msvcrt", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby/1.9.1/i386-msvcrt", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/i386-mswin32", ".", "!tainted!"]
irb191> require "cgi"
SecurityError: Insecure operation - require
        from (irb):5:in `require'
        from (irb):5
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:20:in `<main>'
irb191>

ruby-1.9.1では汚染されたパスが一つでも $:($LOAD_PATH)に含まれると(相対パスで) requireはできない絶対パスならできるがそんな書き方はしないので $:($LOAD_PATH)に追加するパスは常に untaintしなければならない

 ruby-1.9.2dev(2009-02-03)は概ね期待通りの動作だが……

requireしたときのカレトリの扱いに不満が残る

多分従来の Rubyruby-1.9.1ruby-1.8.7$:($LOAD_PATH)の要素の汚染状況なんて気にしていなかった$:に含まれるか含まれないかだけが重要2005年から現在まで変わっていないリファレスマニュアルのこの記述がそれを物語っていない

Level 1以上では起動時に以下の違いがある

  • 環境変数 RUBYLIB$: に加えない
  • カレトリを $: に加えない
  • (以下)

その方針に異議を唱えるものではないけれどこの方式にはーフレベルによる分岐が起動時に限定されるという制限があるコマドラインオプション -T を指定したときにしか有効にならず$SAFEを使ってセーフレベルをコトロールするシナリオでは機能しない

ruby-1.9.2dev$:($LOAD_PATH) の要素の汚染状況に注目することで$SAFEを使ってセールレベルをコトロールする場合で「環境変数 RUBYLIB$: に加えない「カレトリを $: に加えないのと同等の制限を課せる可能性を持っているつまり「環境変数RUBYLIBとカレトリは常に $:($LOAD_PATH)に追加されるただし汚染された状態でということ

それなのに現在の ruby-1.9.2dev$SAFE=1の下での requireに対するカレトリの扱いはruby-1.8.7よりむしろ退化している

ruby-1.8.7では $:($LOAD_PATH)"." を追加したり取り除いたりすることでカレトリの扱いをーフレベルによらずスクリトがコトロールできた

拡張子の有無で結果が変わる動作に筋の通らない ruby-1.9.1requireは論外として

ruby-1.9.2devではカレトリのスクリトの require$:($LOAD_PATH)によらずSecurityErrorになるカレトリを絶対パスで $:($LOAD_PATH)に追加することでコトロール可能だが既に含まれているかもしれない "." が邪魔をするruby-1.9.2dev$:($LOAD_PATH)に含まれる "." の汚染状況(あるいは "."が $:に含まれないこと)によってのみカレトリの扱いを変えるべきでカレトリが特別に SecurityErrorになる現在の ruby-1.9.2devには同意できない

ールレベル1ではまだスクリトを信用しているのだから少なくとも ruby-1.8.7と同等のコトロールをスクリトに渡して欲しい

requireが利用する File.expand_pathの仕様によりカレトリからの相対パスが汚染されるのだろうがFile.expand_pathrequire$:($LOAD_PATH)に依拠していることを知らないのだから requireが何とかすべき

* その後の変更でruby-1.9.1らしき挙動の requireを検出したときはセーフレベルを 1から 0に下げてプラグインを実行することになっているーフレベル0なら今回のことは関係ないからーフレベルを下げるという発想は全く頭になかったなんかこう負けた気がするからだろうruby-1.9.0だとセキュアモ(ーフレベル4)で動かないという話もあったけどどうなったんだろう


20090119() Wassrという Webービスがあってそこに tDiaryというチャンネルがあってFirefoxにはライブブックマークとかいうものがあっていろいろなものを発見(コミトログの確認が svk sync + viewvcより簡単だ古い記事がちょこちょこ投稿されると思ったら delicious..から tDiaryタグの付いた URLを拾っているとほへ)

[Ruby][tDiary] require$SAFE=1と汚染された $LOAD_PATH

>irb
irb(main):001:0> RUBY_DESCRIPTION
=> "ruby 1.8.7 (2008-05-31 patchlevel 0) [i386-mswin32_90]"
irb(main):002:0> $SAFE=1
=> 1
irb(main):003:0> $:.unshift "hoge".taint
=> ["hoge", "C:/Program Files (x86)/ruby/lib/ruby/site_ruby/1.8",..., "."]
irb(main):004:0> require 'cgi'
SecurityError: Insecure operation - require
        from (irb):4:in `require'
        from (irb):4
        from :0
irb(main):005:0>

1.8.7でもこうなのだから知らない俺が抜けているのだが$SAFE=1のときに汚染された文字列を $LOAD_PATHに追加する(pushでも unshiftでも)一切の requireができなくなる

期待したいのはhoge/cgi.rbhoge/cgi.soなどが存在するときにはこのパスは汚染されているので SecurityError存在しないときはファイルの探索を続けて C:/Program Files (x86)/ruby/lib/ruby/1.8/cgi.rb (このパスは汚染されていないはず)を読み込むという動作なのだけど……

実際はそうではないのだから tDiary

tdiary.rb:12: $:.insert( 1, File::dirname( __FILE__ ) + '/misc/lib' )

というのは __FILE__ が汚染されているときにわりと危険な操作ということになる問題が起きないのは SAKURAのレンタルサーバの Ruby1.8.6だからなのか__FILE__File.dirname(__FILE__) が汚染されていることが稀だからなの(汚染されていることが実際にあるのは、20090117p01で書いたようにuntaintすることで状況が改善したことから推測でき)


問題が起きないのは SAKURAのレンタルサーバの Ruby1.8.6だからなのか__FILE__File.dirname(__FILE__) が汚染されていることが稀だからなの

両方でした__FILE__が汚染されているのは Ruby-1.9.1RC1だから(多分)


$SAFE=1のときに汚染された文字列を $LOAD_PATHに追加する(pushでも unshiftでも)と、一切の requireができなくなる

書きながら誇張だとは気付いていたのだけど(一切のの部分が)そうでない例を自分で見つけたので追記(2009-02-02)

Windowsフルパスであるいは拡張子(.rb)なしのフルパスでなら requireできる

Y:\...\Desktop\a>irb
irb(main):001:0> RUBY_DESCRIPTION
=> "ruby 1.8.7 (2008-05-31 patchlevel 0) [i386-mswin32_90]"
irb(main):002:0> $SAFE=1
=> 1
irb(main):003:0> $:.push "".taint
=> ["C:/Program Files (x86)/ruby/lib/ruby/site_ruby/1.8", "C:/Program Files (x86)/ruby/lib/ruby/site_ruby/1.8/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby/site_ruby", "C:/Program Files (x86)/ruby/lib/ruby/vendor_ruby/1.8", "C:/Program Files (x86)/ruby/lib/ruby/vendor_ruby/1.8/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby/vendor_ruby", "C:/Program Files (x86)/ruby/lib/ruby/1.8", "C:/Program Files (x86)/ruby/lib/ruby/1.8/i386-mswin32_90", ".", ""]
irb(main):004:0> require "a"
SecurityError: Insecure operation - require
        from (irb):4:in `require'
        from (irb):4
        from :0
irb(main):005:0> require "a.rb"
SecurityError: Insecure operation - require
        from (irb):5:in `require'
        from (irb):5
        from :0
irb(main):006:0> require "./a.rb"
SecurityError: Insecure operation - require
        from (irb):6:in `require'
        from (irb):6
        from :0
irb(main):007:0> require "Y:/.../Desktop/a/a"
=> true
irb(main):008:0> require "Y:/.../Desktop/a/a.rb"
=> false
irb(main):009:0> require "a"
SecurityError: Insecure operation - require
        from (irb):9:in `require'
        from (irb):9
        from :0
irb(main):010:0>

20090117()

[Ruby][tDiary] 昨日(「引き続き rexml/source.rb:16requireSecurityErrorになる原因を探る)の続き

step1 load.c:147 (rb_feature_p)
   if (!load_path) load_path = rb_get_expanded_load_path();
step2 load.c:44 (rb_get_expanded_load_path)
   VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
step3
   Insecure Operation - require (SecurityError)

いましたRuby1.9.1SecurityErrorを量産する rb_get_expand_path()どうも汚染された load_pathの一つを展開しようとして SecurityErrorになってる気がする


$:($LOAD_PATH)の要素が汚染されてるのはこちらの責任では?と思って確かめてみた

SecurityErrorの直前で$:の各要素が tainted?かどうかを TDiary::Config#debugを使って出力した結果

D, [2009-01-17T23:36:46.289008 #1212] DEBUG -- : false Y:/server_root/www/ds14050/tdiary_on_ruby191
D, [2009-01-17T23:36:46.289008 #1212] DEBUG -- : true Y:/server_root/www/ds14050/tdiary_on_ruby191/misc/lib
D, [2009-01-17T23:36:46.289008 #1212] DEBUG -- : false C:/Program Files (x86)/ruby/lib/ruby19/site_ruby/1.9.1
D, [2009-01-17T23:36:46.289985 #1212] DEBUG -- : false C:/Program Files (x86)/ruby/lib/ruby19/site_ruby/1.9.1/i386-msvcr90
D, [2009-01-17T23:36:46.289985 #1212] DEBUG -- : false C:/Program Files (x86)/ruby/lib/ruby19/site_ruby
D, [2009-01-17T23:36:46.289985 #1212] DEBUG -- : false C:/Program Files (x86)/ruby/lib/ruby19/vendor_ruby/1.9.1
D, [2009-01-17T23:36:46.289985 #1212] DEBUG -- : false C:/Program Files (x86)/ruby/lib/ruby19/vendor_ruby/1.9.1/i386-msvcr90
D, [2009-01-17T23:36:46.290961 #1212] DEBUG -- : false C:/Program Files (x86)/ruby/lib/ruby19/vendor_ruby
D, [2009-01-17T23:36:46.290961 #1212] DEBUG -- : false C:/Program Files (x86)/ruby/lib/ruby19/1.9.1
D, [2009-01-17T23:36:46.290961 #1212] DEBUG -- : false C:/Program Files (x86)/ruby/lib/ruby19/1.9.1/i386-mswin32_90
D, [2009-01-17T23:36:46.290961 #1212] DEBUG -- : false .

ひとつありましたねtDiaryが該当パスを $LOAD_PATHに挿入する部分で下のように untaintをつけるだけで理不尽な SecurityError解決しました(ただし、ASRでは依然 SecurityErrorになる解決したのは、20090116p01で書いたようにload.c501行目をコメトアトした Ruby-1.9.1RC1での)

-tdiary.rb:12: $:.insert( 1, File::dirname( __FILE__ ) + '/misc/lib' )
+tdiary.rb:12: $:.insert( 1, File::dirname( __FILE__ ).untaint + '/misc/lib' )

今回の一連の流れ(20090113p0120090114p0120090116p01)$SAFE=1SecurityErrorで使い物にならなくなる(>添付ライブラリの requireにも失敗する)二つのルトが見つかったそれらは requireするライブラリの拡張子を明示したり$LOAD_PATHの中身をすべて untaintすることで回避できたりload.cの一行をコメトアトしたりで回避できたがスクリトで対処すべきものではないと考えるfile_expand_path$SAFE>0のとき汚染された入力を一切受け付けないという前提のもと(rb_)file_expand_pathを呼び出しているコドを見直すかfile_expand_pathが汚染された入力を受け入れて適切に処理するかどちらかの変更が必要だと思うfile_expand_path()の結果が汚染された入力$LOAD_PATHの汚染された一要素に基づくときその展開されたパスも汚染されている$SAFE=1のとき最終的に requireするファイルのパスが汚染された引数や$LOAD_PATHの汚染された要素に基づくときSecurityErrorというのではいけないのだろうRuby-1.8.7はそのへんうまくやっているのだが……

改めドキュメトを読んだら汚染された文字列を引数にした Fileのクラスメソスタスメソドは禁止されていた($SAFE=1のと)

ドキュメトに従うなら rb_file_expand_pathSecurityErrorを出すのは正しいのかも(Ruby-1.8.7がまちがっている)それならば$LOAD_PATHの汚染された要素を不用意に展開しようとして SecurityErrorを出したり(load.c:44:rb_get_expanded_load_path)もともと汚染されていなかった文字列を複数回展開しようとして SecurityErrorを出したり(load.c:501:search_required)するほうを修正しなければ

私見では(最下層で実際の仕事を行う)file_expand_pathは汚染フラグを適切に伝播させるものの SecurityErrorは出さないでおき(スクリトから呼ばれる)File.expand_pathの実体である rb_file_s_expand_pathfile_expand_pathに仕事を丸投げする rb_file_expand_pathでセーフレベルに基づくチックを行うのが呼び出し側にとって便利だと思う

tDiaryのプラグインの recent_list.rbを書き換えたのは今思えば不要だったみたいだ(Rubyの方が変わるに違いないも)


20090116()

[Ruby][tDiary] Ruby1.9.1RC1Insecure Operation - require (SecurityError)が頻発する原因

20090113p0120090114p01で発生したエラーを起こす最小のスクリトとそれを回避する方法

>type a.rb
puts "a.rb required."

>ruby19 -v
ruby 1.9.1 (2008-12-30 patchlevel-0 revision 21203) [i386-mswin32_90]

>ruby19 -e "$SAFE=1; require 'a'"
-e:1:in `require': Insecure operation - require (SecurityError)
        from -e:1:in `<main>'

>ruby19 -e "$SAFE=1; require 'a.rb'"
a.rb required.

二つの違いは requireするライブラリの拡張子(.rb)を明示しているかどう拡張子なしの場合に発生する SecurityErrorは間違いだと思うそうでないと $SAFE = 1がまるで使い物にならない添付ライブラリだってまともに動かなくなるんだから

ところで、Ruby 1.9 - 1.9.1 RC2 issues - Ruby Issue Tracking Systemにはチケトを作成するためのフームがないruby-dev MLはアーカイブをときどき閲覧しているが購読はしていない是非ともこの SecurityErrorは消して欲しいのだが報告を受け付ける間口が狭い直通ルトがないどうすべ


どうすべと言ってる間に原因究明

 load.c:500: type = rb_find_file_ext(&tmp, loadable_ext);
 load.c:501: tmp = rb_file_expand_path(tmp, Qnil);

501行目が不要に思えるそしてこれが SecurityErrorの原因rb_find_file_extは内部で rb_file_expand_pathfile_expand_pathを呼びその結果を tmpにコピーしてくれている二度目を呼ぶ必要はないのでは? rb_file_expand_pathは適宜汚染されたStringオブジトを返しまた $SAFE>0のとき汚染された引数を SecurityErrorで拒絶するので複数回の (rb_)file_expand_path呼び出しは容易に SecurityErrorを引き起こす。これは Ruby1.9.1Ruby1.8.7とは異なっている動作

>irb
irb(main):001:0> File.expand_path("a")
=> "Y:/a"
irb(main):002:0> File.expand_path("a").tainted?
=> true
irb(main):003:0> File.expand_path(File.expand_path("a"))
=> "Y:/a"
irb(main):004:0> $SAFE=1
=> 1
irb(main):005:0> File.expand_path(File.expand_path("a"))
=> "Y:/a" # $SAFE>0で、taintedな文字列でも展開する。(Ruby1.8.7)
irb(main):006:0> exit

>irb19
irb(main):001:0> File.expand_path("a")
=> "Y:/a"
irb(main):002:0> File.expand_path("a").tainted?
=> true
irb(main):003:0> File.expand_path(File.expand_path("a"))
=> "Y:/a"
irb(main):004:0> $SAFE=1
=> 1
irb(main):005:0> File.expand_path(File.expand_path("a"))
 # $SAFE>0で、taintedな文字列を引数にすると SecurityError (Ruby1.9.1RC1)
SecurityError: Insecure operation - expand_path
        from (irb):5:in `expand_path'
        from (irb):5
        from C:/Program Files (x86)/ruby/bin/irb19.bat:20:in `<main>'
irb(main):006:0>

問題設定が間違っていたのか? load.cの一行をコメトアトしたことでたしかに一つの SecurityErrorは消えたが tDiaryは動かない。20090114p01のエラーがまだ出る

ただ、20090114のタトルにちらっと書いたopen-uriSecurityErrorはでなくなってる

>irb19 (野良パッチ済み)
irb(main):001:0> $SAFE=1
=> 1
irb(main):002:0> require 'open-uri'
=> true
irb(main):003:0> open 'http://www.example.com'
=> #<StringIO:0x2b8e924>
irb(main):004:0>

比較として ASRでエラーが出るのを確認するただASRでも二回目以降の openはエラーにならない謎の挙動この SecurityErrorも本来発生すべきものではないのだろう

>"C:\Program Files (x86)\ActiveScriptRuby-1.9.1\bin\irb.bat"
irb(main):001:0> $SAFE=1
=> 1
irb(main):002:0> require 'open-uri'
=> true
irb(main):003:0> open 'http://www.example.com'
SecurityError: Insecure operation - write
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:375:in `write'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:375:in `<<'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:375:in `<<'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:322:in `block (3 levels) in open_http'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/net/protocol.rb:373:in `call_block'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/net/protocol.rb:364:in `<<'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/net/protocol.rb:88:in `read'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/net/http.rb:2333:in `read_body_0'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/net/http.rb:2288:in `read_body'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:321:in `block (2 levels) in open_http'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/net/http.rb:1120:in `block in transport_request'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/net/http.rb:2251:in `reading_body'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/net/http.rb:1119:in `transport_request'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/net/http.rb:1103:in `request'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:312:in `block in open_http'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/net/http.rb:564:in `start'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:306:in `open_http'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:767:in `buffer_open'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:201:in `catch'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:669:in `open'
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/open-uri.rb:33:in `open'
        from (irb):3
        from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:21:in `<main>'
irb(main):004:0> open 'http://www.example.com'
=> #<StringIO:0x2b611a4>
irb(main):005:0>

引き続き rexml/source.rb:16requireSecurityErrorになる原因を探る(tDiaryを起動しないと再現させられないのが辛)


20090114() $SAFE=1だと添付ライブラリ(open-uri)SecurityErrorを出しまくるんだけど……260行目の require 'net/http' で出る375行目の StringIOに書き込むところでも出る破綻してる気がする

[tDiary][Ruby] 昨日のつづきrecent_listを実際に修正

方針は昨日書いたとおりプラグインが自由に日記データを取得できる手段を提供した

日記を一日書いたとたんにエラーということはなくなったみたい


$SAFE=1requireが失敗する(ァイル名の untaintもしているのに)のがそもそもおかしいopen-urirexmlで同様に requireSecurityErrorエラーが生じていることからも疑惑の目がウチの Rubyに向いてきた1.9.1RC1だからではな「ウチでコンパイルしたからあるいは(開発者に)利用者が少なそうな Windows(それも Vista)だからなのかもしれない


ASRをイールしてみたけどダメだった同じtDiaryをセキュアモドで動かしているわけではないので Rubyのセーフレベルは最高でも 1taintedな文字列を使った requireが失敗するならわかるでも rexml/source.rb16行目require 'stringio'ったべたのリテラルだ

500 Internal Server Error

Insecure operation - require (SecurityError)

C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/rexml/source.rb:16:in `require'
C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/rexml/source.rb:16:in `create_from'
C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:146:in `stream='
C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:123:in `initialize'
C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/rexml/parsers/treeparser.rb:9:in `new'
C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/rexml/parsers/treeparser.rb:9:in `initialize'
C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/rexml/document.rb:228:in `new'
C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/rexml/document.rb:228:in `build'
C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/rexml/document.rb:43:in `initialize'
(plugin/amazon.rb):231:in `new'
(plugin/amazon.rb):231:in `amazon_get'
(plugin/amazon.rb):322:in `isbn_image'
(TDiary::Plugin#eval_src):32:in `block in eval_src'
Y:/.../server_root/www/ds14050/tdiary_on_ruby191/tdiary.rb:787:in `eval'
Y:/.../server_root/www/ds14050/tdiary_on_ruby191/tdiary.rb:787:in `block in eval_src'
Y:/.../server_root/www/ds14050/tdiary_on_ruby191/tdiary.rb:112:in `block in safe'

20090113() [Vista] >clipboard 'clipboard'内部コマドまたは外部コマ操作可能なプログラムまたはバッチ ファイルとして認識されていません >clip: "CLIP /?" と入力すると使用法が表示されます。 >clip /? コマド ライン ツールの出力を Windows クリップボドにリダイレトします。(っぱりあるよね手コピしなくてすんでよかったなお XPには…)

最終更: 2015-07-09T23:54+0900

[tDiary][Ruby] Insecure operation - require (SecurityError)

tdiary/trunk (r3394)ruby 1.9.1 (2008-12-30 patchlevel-0 revision 21203) [i386-mswin32_90] で動かしてみた

dot.htaccesstdiary.conf.beginnerを編集&リネームしてップページの表示と一通りの設定変更を済ませて記念すべき最初の書き込ップページすら表示されなくなりました

Insecure operation - require (SecurityError)

Y:/.../tdiary_on_ruby191/tdiary.rb:434:in `require'
Y:/.../tdiary_on_ruby191/tdiary.rb:434:in `block in load_styles'
Y:/.../tdiary_on_ruby191/tdiary.rb:433:in `glob'
Y:/.../tdiary_on_ruby191/tdiary.rb:433:in `load_styles'
Y:/.../tdiary_on_ruby191/tdiary/defaultio.rb:142:in `initialize'
Y:/.../tdiary_on_ruby191/tdiary.rb:1069:in `new'
Y:/.../tdiary_on_ruby191/tdiary.rb:1069:in `initialize'
Y:/.../tdiary_on_ruby191/tdiary.rb:1660:in `initialize'
Y:/.../tdiary_on_ruby191/tdiary.rb:1858:in `initialize'
(plugin/recent_list.rb):39:in `new'
(plugin/recent_list.rb):39:in `block (3 levels) in recent_list'
(plugin/recent_list.rb):37:in `reverse_each'
(plugin/recent_list.rb):37:in `block (2 levels) in recent_list'
(plugin/recent_list.rb):36:in `reverse_each'
(plugin/recent_list.rb):36:in `block in recent_list'
(plugin/recent_list.rb):35:in `catch'
(plugin/recent_list.rb):35:in `recent_list'
(TDiary::Plugin#eval_src):67:in `block in eval_src'
Y:/.../tdiary_on_ruby191/tdiary.rb:787:in `eval'
Y:/.../tdiary_on_ruby191/tdiary.rb:787:in `block in eval_src'
Y:/.../tdiary_on_ruby191/tdiary.rb:112:in `block in safe'

プラグイン:recent_listが原因(外したら解決し)

$SAFE==1の状況で TDiaryMonth.new()するのがダメっぽい

recent_list()を呼ばれたときにそのたびにTDiaryMonth.new()するんでなくて読み込まれたときに必要なデータを準備しておけばいいんじゃないかとか思ったけどevalTDiaryMonthクラスにアクセサを追加したりしているあたり*反則泥縄の対応では気が済まないプラグインが日記データを要求できるようなインターフェイスが求められている(現在は TDiaryXXXX#initializeで読み込まれたもののみPlugin@diariesからアクセスできる)然るべき手段を用意したのちrecent_list.rbはそれを利用するべき

* 歴史的経緯>http://kitaj.no-ip.com/tdiary/20021106.html#p03


20080515() 正規表現の存在を知りその文法を知ったのは JScript5.5HTMLヘルプだったほんとう役に立ドキュメトだった(>20080215p01) 「だったといいつつ今も持っていて参照もしているけれど

[Ruby][正規表現] /n, /s, /e, /u, $KCODEのもやっとを解消

正規表現リテラルの /nseuフラグは正規表現のマッチ動作に影響を与える(/nseuフラグのいずれも指定しなかった場合は実行時の $KCODEに従)

/nが指定されていたり $KCODE='NONE'のとき.は改行を除いたり改行を含んだりする 1にマッチするメタ文字だが/seuフラグが指定されていたり $KCODESsEeUuのいずれかで始まる文字列のとき.は日本語を含むShift_JISEUC-JPUTF-8一文字(1-3?)にマッチする

/nseuフラグや $KCODEは正規表現のパターンの解釈にも影響を与える

Shift_JISで保存したスクリトファイルに /w/ というパターンと 'w' という文字列リテラルがありッチを行った場合実行時に $KCODE='NONE'であればパターンは /\225\w/ と解釈され"\225"の後にメタ文字 \wにマッチする文字を探し失敗する$KCODE='SJIS'であればパターンは /w/ と解釈され""のあとに "w"を探し成功する

irb(main)> /表w/n =~ '表w'
=> nil
irb(main)> /表w/s =~ '表w'
=> 0

正規表現パターンの中のマルチバト文字は文字列の場合と同じくあくまでバト列であり/nseuフラグや $KCODEがどうであれ EUC-JPで保存されたスクリトの中の正規表現リテラル //Shift_JIS「あを表すバト列 "\202\240" にマッチすることはない


20080508() [Vista] 「プログラムから開くが便利なんだけどフォルダを対象にできないのが玉に瑕Unknown\shell\openasdirectory\shell\openasにコピーするとダイアログを開くことはできるがプログラムのリトがコンテクトメニーに展開されたりはしない

最終更: 2009-09-01T05:05+0900

[SHJS][Ruby] '%04d-%02d-%02d' % [2008, 5, 8] がうまくハイラトできない理由

このようにハイラトされます。

'%04d-%02d-%02d' % [2008, 5, 8]

(整形した)HTMLースはこう

<span class="sh_string">'%04d-%02d-%02d'</span> 
<span class="sh_string">% [2008, </span>
<span class="sh_number">5</span>
<span class="sh_symbol">,</span> 
<span class="sh_number">8</span>
<span class="sh_cbracket">]</span>

% [2008, が一つの文字列にされてしまっているどういう判断なのかと調べれば%!string! と同じものだと見なされていた(そのルールは自分で書いたんだけど)

っていたでしょうか? %リテラルの区切りには空白(改行も!)が使えるのでした(alnummbchar以外なら OKっぽい変態すぎる)


20080417() JavaScriptHTMLを初めてさわったのは Win98「フォルダのカスタマイズWMPを埋め込んで試聴できるようにしたり

[tDiary][Ruby] CGI.escapeERB::Util.u の違い

http://tdiary.cvs.sourceforge.net/tdiary/plugin/category.rb?revision=1.45.2.1&view=markup&sortby=date&pathrev=Stable-2_2

  • %20になる(ERB::Util.u)
  • +になる(CGI.escape)

気付いたのは日記を書くときにカテゴリ名入力支援機能(クリックすると本文にカテゴリが挿入される*)のカテゴリリトに目当てのカテゴリがなかったから

脱線何かのソースを見たときに思ったのだけど ERB::Util.uCGI.escape もエンコドしすぎだと感じてる人がいるみたい(一部の記号をわざわざ復号していたたしかに %XXURLに現れるのは美しくない)

閑休存在するはずのカテゴリファイルがなくてエラーを出していたのはここ(20071208p01)で自分が書いた tdiary/categorizedio.rbったので誰にでも起こる不具合なのか確証がなかったり

http://tdiary-users.sourceforge.jp/cgi-bin/wforum/wforum.cgi?mode=allread&no=5718&page=0

tDiary標準のカテゴリモドがどのようになるのかは未確認だったり

複数のポトを日付で括ってしまう tDiary(<日記だから)はどうしても <title>タグの中身が味気なくなってしまってトにも人間にもアピールが弱いなとか全然関係ないけどいま思った(BlogKitでは解決してそ)

ぼそり(category.rb@conf.data_path'category'を連結するときにパスセパレータを二重化してる問題はレンタルサーバ(FreeBSD)でもローカル(Windows)でも起きていないがそういうのが気持ちわるい&気にしたくないので自分は File.joinScripting.FileSystemObject.BuildPathを必ず使)

* 本文の末尾でなくカーソル位置にカテゴリを挿入するための変更はこちら > http://www.kde.ics.tut.ac.jp/%7Efrsh/tdiary/?date=20071220#p01

 Firefox3はデコドした URLをロケーションバーに表示してクリップボドにはエンコドした URLをコピーするので二重にエンコドされた部分が含まれるAmazonやブックマークサービスの URLでしか %XX を見ることはなくなりそう


20080404() *ss[]sizeof の結果も違っていたはず。仮引数に s[]とも書けるのはデメリトでしかない実際はポインタなのだから

最終更: 2012-01-26T13:29+0900

[Ruby] 最近は Cのポインタが流行りらしい

Rubyに来たときは意識しなかったが最近 Ruby側から C++を眺めたときにあまりの違いに恐れおののいたこと(限りあるスタックの使いすぎに注意しようね)

 C++の変数はごついあるは近い (蛇足もちろん全てがそうとは言わな)

# Ruby
myobject = MyClass.new();
// C++
MyClass myobject;
MyClass *pmyobject = &myobject;

Rubyでは MyClass.new()MyClassのイスタスを作りそれを後から参照するために myobjectという名札を貼り付けているC++では MyClass myobject; だけで既にイスタスが存在していて名札を貼り付ける行為は二行目が相当するRubyには myobjectのようにオブジトそのものを表す変数は存在しない*

書いてて思ったポインタ(に近いもの参照C++の参照とは違うもの)はスクリト言語では普通に使われている*4Rubyでは C++myobjectに相当するものがなく全てのオブジトが一段遠くにあるからC++でやるように (*pmyobject).hoge()pmyobject->hoge() というようにポインタをデリファレスする手間を省いて myobject.hoge() という書き方でメソドを呼べるがRubymyobjectC++myobjectよりむしろポインタの pmyobjectに一番近い

* Fixnumは例外

 これが Ruby++--が存在しない理由かとも思ったがC++で単項インクリメ/デクリメトをメンバ関数でオーバーロドできることを考えると Rubyでやっていけない理由がわからないRubyでも ++相当のメソドを定義できるということだし全てがオブジ(内部状態を持てる)であることを謳っている Rubyだからこそ制約なしにやっても構わないんじhttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/5323

 いやいやいや仮に ++/--というメッセージが追加されても Numericはイミータブルだという理由で使えなければ 99%の利用場面が奪われるこれをなんとかすると +++=のシンタックスシュガーになったりFixnumがオブジトでない(=変数がオブジトへの参照でない)ことが露呈したりa=b=1; ++b;a2 になったりするこれは違う

*4 C++&のような明示的にスを取得する方法がないのでポインタのポインタは存在しない


20080317() Google(jp)経由でこの日記を初めて見つけた (SHJSで検索30件表示してると 1ージ目()検索しても見つけられないレアなサトだったのに……っと客観視してみるとえらく解りにくく読みにくい文章を書いていた

[Ruby] RUBY_INSTALL_NAMEruby以外に変更してもイールできるようになってる (Ruby1.9)

win32/configure.batが生成する Makefileを編集して* ruby19.exeを作るようにしていると ruby-dev:34000 と同じところで止まっていたのでした

MLのスレドを読んでRUBY_SUFFIXだけでなく RUBY_INSTALL_NAMEも反映して欲しいと思ったらそのように変更されてコミトされていたそれは手元の Makefile.subと同じです。

* configure.batの引数として与える方が人手を介さない分良さそう1.8のときに prefixオプションが効かなくて Makefileの直編集に切り替えたのだった気がするが1.9.0-1では効いていたと思う(最初いつも通りにしたら C:/Program Files (x86)/ruby/Program Files (x86)/rubyにイールされたのはprefix=PREFIX=が両方有効だったからだと思う)