Project

General

Profile

Bug #8731

Problems when parsing notation decl and entity decl with REXML::Parsers::SAX2Parser

Added by ohai (Ippei Obayashi) over 6 years ago. Updated over 6 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.1.0dev (2013-08-04 trunk 42372) [x86_64-linux]
[ruby-dev:47582]

Description

以下のコード(sax2parser_decl_error.rb)を実行すると例外が発生します。
require 'rexml/parsers/sax2parser'
require 'rexml/sax2listener'

xml = <
<!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

sax2parser_decl_error.rb (302 Bytes) sax2parser_decl_error.rb ohai (Ippei Obayashi), 08/04/2013 06:01 PM
rexml-sax2parser-fix.patch (1.34 KB) rexml-sax2parser-fix.patch ohai (Ippei Obayashi), 08/04/2013 06:01 PM
rexml-sax2listener-doc.patch (1.6 KB) rexml-sax2listener-doc.patch ohai (Ippei Obayashi), 08/04/2013 06:01 PM
rexml-sax2parser-unittest.patch (606 Bytes) rexml-sax2parser-unittest.patch ohai (Ippei Obayashi), 08/04/2013 06:01 PM
#1

Updated by kou (Kouhei Sutou) over 6 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 6 years ago

報告ありがとうございます。

SAX2Listener#entitydeclは引数を1つだけ受け取るようにしました。非互換な変更になりますが、ドキュメントには引数は配列1つと書いているので、実装のバグだと判断しました。

notationdeclの方は引数の数が固定だったので、配列ではなく個々の引数として受け取るようにしました。こっちはSAX2Listnerが提供するデフォルトのイベントハンドラーメソッドのバグで、呼ばれ方は変更がないので非互換ではないという判断です。

ドキュメントの方ですが、元のドキュメントの通り、"%"は一番最初にくる方が元の宣言と同じになって自然だと思ったので、そっちは実装を直しています。"%"以外のゴミが入っているやつの方はドキュメントを直しました。

Also available in: Atom PDF