[#44925] [Backport93 - Backport #5702][Open] backport r33935 — Yusuke Endoh <mame@...>

19 messages 2011/12/03

[#44940] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode. — Tanaka Akira <akr@...>

2011/12/6 <naruse@ruby-lang.org>:

9 messages 2011/12/05
[#44941] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode. — KOSAKI Motohiro <kosaki.motohiro@...> 2011/12/05

2011年12月5日16:56 Tanaka Akira <akr@fsij.org>:

[#44942] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode. — KOSAKI Motohiro <kosaki.motohiro@...> 2011/12/05

> おかしいな。gdbmは勝手にcreateフラグを立ててしまうので当該2つの

[#44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない — Yui NARUSE <naruse@...>

12 messages 2011/12/13

[#45021] [ruby-trunk - Bug #5786][Open] LoadError: cannot load such file -- openssl — Kazuhiro NISHIYAMA <redmine@...>

11 messages 2011/12/21

[#45057] [ruby-trunk - Feature #5820][Assigned] Merge Onigmo to Ruby 2.0 — Yui NARUSE <naruse@...>

21 messages 2011/12/28

[ruby-dev:45069] [ruby-trunk - Bug #5390] YAML.load が、正しく解析できないエンコーディングの文字列も受け付けてしまう

From: Ayumu AIZAWA <ayumu.aizawa@...>
Date: 2011-12-30 18:46:04 UTC
List: ruby-dev #45069
Issue #5390 has been updated by Ayumu AIZAWA.



YAML::ENGINE.yamler が syck のみ再現します。
ruby1.9.2 をお使いの場合は require 'yaml' する前に require 'psych' するか YAML::ENGINE.yamler = 'psych' すると以下のようにPsych::SyntaxErrorとなります。

 ---- ruby 2.0.0dev
 $ cat bug_5390.rb 
 # coding: Shift_JIS
 require 'yaml'
 text = '["?\"]'
 p YAML::ENGINE.yamler
 p text.encoding
 str = YAML.load(text).first
 
 $ ruby -v bug_5390.rb 
 ruby 2.0.0dev (2011-12-30 trunk 34161) [x86_64-darwin10.8.0]
 "psych"
 #<Encoding:Shift_JIS>
 /Users/ayumin/tmp/ruby/lib/ruby/2.0.0/psych.rb:192:in `parse': (<unknown>): invalid leading UTF-8 octet at line 1 column 1 (Psych::SyntaxError)
 	from /Users/ayumin/tmp/ruby/lib/ruby/2.0.0/psych.rb:192:in `parse_stream'
 	from /Users/ayumin/tmp/ruby/lib/ruby/2.0.0/psych.rb:150:in `parse'
 	from /Users/ayumin/tmp/ruby/lib/ruby/2.0.0/psych.rb:126:in `load'
 	from bug_5390.rb:6:in `<main>'

 ---- ruby1.9.2

 $ cat bug_5390.rb 
 # coding: Shift_JIS
 require 'yaml'
 text = '["?\"]'
 YAML::ENGINE.yamler = 'psych'
 str = YAML.load(text).first
 
 $ ruby -v bug_5390.rb 
 ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin10.8.0]
 /Users/ayumin/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych/deprecated.rb:79: warning: method redefined; discarding old to_yaml_properties
 /Users/ayumin/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/syck/rubytypes.rb:13: warning: previous definition of to_yaml_properties was here
 /Users/ayumin/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in `parse': couldn't parse YAML at line 1 column 0 (Psych::SyntaxError)
 	from /Users/ayumin/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in `parse_stream'
 	from /Users/ayumin/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:119:in `parse'
 	from /Users/ayumin/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:106:in `load'
 	from bug_5390.rb:5:in `<main>'
  


----------------------------------------
Bug #5390: YAML.load が、正しく解析できないエンコーディングの文字列も受け付けてしまう
https://bugs.ruby-lang.org/issues/5390

Author: yu nobuoka
Status: Assigned
Priority: Normal
Assignee: Aaron Patterson
Category: 
Target version: 2.0.0
ruby -v: ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]


[[ruby-list:48419]] にてバグ扱いでいいだろうという話がありましたのでバグとして報告します。

YAML.load がどのように実装されているのかコードを追いきれなかったのですが、動きを見る限り、与えられた文字列のエンコーディングを気にせずにパースしているように思います。 このため、Shift_JIS のようなエンコーディングの文字列の一部を正しくパースできません。

 --- source code ---
 # coding: Shift_JIS
 require "yaml"
 text = '[ "噂" ]' # Shift_JIS の '噂' の 2 バイト目はバックスラッシュと同じバイト値
 str = YAML.load( text ).first # エラー発生

 --- output ---
 /home/nobuoka/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/syck.rb:135:in `load': syntax error on line 0, col 9: `' (ArgumentError)
 	from /home/nobuoka/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/syck.rb:135:in `load'
 	from yaml_cp932.rb:4:in `<main>'

Shift_JIS の文字列でもほとんどの場合は例外発生せずにパースされるので、Shift_JIS の文字列を使っている場合に問題が起こる可能性をユーザーが認識しづらいという問題があります。 よって、現在の動きはバグとして、以下のいずれかの動きに変更した方が良いのではないでしょうか。

*UTF-8 (UTF-16 も?) 以外のエンコーディングの文字列が渡された場合に例外を発生させる
*UTF-8 以外のエンコーディングの文字列が渡された場合に、自動的に UTF-8 に変換して処理を進める
*YAML の解析部分でエンコーディングを考慮するようにして、Shift_JIS などでも正しく解析できるようにする



-- 
http://redmine.ruby-lang.org

In This Thread