Bug #8731
closedProblems when parsing notation decl and entity decl with REXML::Parsers::SAX2Parser
Description
以下のコード(sax2parser_decl_error.rb)を実行すると例外が発生します。
require 'rexml/parsers/sax2parser'
require 'rexml/sax2listener'
xml = <<EOS
<!NOTATION x SYSTEM "URIx">
]>
EOS
class Listener
include REXML::SAX2Listener
end
parser = REXML::Parsers::SAX2Parser.new(xml)
parser.listen(Listener.new)
parser.parse
> test_sax2parser.rb:21:in `entitydecl': wrong number of arguments (3 for 1) (ArgumentError)¶
これは SAX2Parser#handle から SAX2Listener#entitydecl, notationdecl に渡す引数の個数が違っているのが問題です。
添付した rexml-sax2parser-fix.patch で修正されます。ユニットテストは rexml-sax2parser-unittest.patch です。
さらに、rexml-sax2listener-doc.patch でドキュメントの修正をしています。
Files
Updated by kou (Kouhei Sutou) over 11 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r42513.
Ippei, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- NEWS (REXML::Parsers::SAX2Parser): Add about this change.
- lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse):
Fix wrong number of arguments. Document says "an array of the
entity declaration" but it passes two or more arguments.
This is a bug but it break backward compatibility.
Reported by Ippei Obayashi. [Bug #8731] [ruby-dev:47582] - lib/rexml/sax2listener.rb (REXML::SAX2Listener#entitydecl): ditto.
The listener template accepted two arguments. - test/rexml/parser/test_sax2.rb: Add tests for external ID case.
Updated by kou (Kouhei Sutou) over 11 years ago
報告ありがとうございます。
SAX2Listener#entitydeclは引数を1つだけ受け取るようにしました。非互換な変更になりますが、ドキュメントには引数は配列1つと書いているので、実装のバグだと判断しました。
notationdeclの方は引数の数が固定だったので、配列ではなく個々の引数として受け取るようにしました。こっちはSAX2Listnerが提供するデフォルトのイベントハンドラーメソッドのバグで、呼ばれ方は変更がないので非互換ではないという判断です。
ドキュメントの方ですが、元のドキュメントの通り、"%"は一番最初にくる方が元の宣言と同じになって自然だと思ったので、そっちは実装を直しています。"%"以外のゴミが入っているやつの方はドキュメントを直しました。