From 7e0022bc8e89cd125f5fe97bc81a169d72d912e9 Mon Sep 17 00:00:00 2001 From: kou Date: Sun, 11 Aug 2013 09:41:29 +0000 Subject: * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse): Fix wrong "%" position in parameter entity declaration event argument. * test/rexml/parser/test_sax2.rb: Add tests for the above case. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42518 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ lib/rexml/parsers/sax2parser.rb | 20 ++++++++++++++++++-- test/rexml/parser/test_sax2.rb | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1580bd2e4e..282b3e509f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sun Aug 11 18:40:25 2013 Kouhei Sutou + + * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse): + Fix wrong "%" position in parameter entity declaration event argument. + * test/rexml/parser/test_sax2.rb: Add tests for the above case. + Sun Aug 11 18:08:40 2013 Kouhei Sutou * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse): diff --git a/lib/rexml/parsers/sax2parser.rb b/lib/rexml/parsers/sax2parser.rb index 4a95bc6fff..5e0f0fbf95 100644 --- a/lib/rexml/parsers/sax2parser.rb +++ b/lib/rexml/parsers/sax2parser.rb @@ -177,12 +177,28 @@ module REXML handle( :characters, copy ) when :entitydecl @entities[ event[1] ] = event[2] if event.size == 3 + parameter_reference_p = false case event[2] when "SYSTEM" - event[4, 0] = "NDATA" if event.size == 5 + if event.size == 5 + if event.last == "%" + parameter_reference_p = true + else + event[4, 0] = "NDATA" + end + end when "PUBLIC" - event[5, 0] = "NDATA" if event.size == 6 + if event.size == 6 + if event.last == "%" + parameter_reference_p = true + else + event[5, 0] = "NDATA" + end + end + else + parameter_reference_p = (event.size == 4) end + event[1, 0] = event.pop if parameter_reference_p handle( event[0], event[1..-1] ) when :processing_instruction, :comment, :attlistdecl, :elementdecl, :cdata, :notationdecl, :xmldecl diff --git a/test/rexml/parser/test_sax2.rb b/test/rexml/parser/test_sax2.rb index a4279fa5d3..5ce9db79fd 100644 --- a/test/rexml/parser/test_sax2.rb +++ b/test/rexml/parser/test_sax2.rb @@ -103,6 +103,47 @@ class TestSAX2Parser < Test::Unit::TestCase end end end + + class TestParameterEntity < self + class TestValue < self + def test_double_quote + assert_equal([["%", "name", "value"]], parse(<<-INTERNAL_SUBSET)) + + INTERNAL_SUBSET + end + + def test_single_quote + assert_equal([["%", "name", "value"]], parse(<<-INTERNAL_SUBSET)) + + INTERNAL_SUBSET + end + end + + class TestExternlID < self + def test_system + declaration = [ + "%", + "name", + "SYSTEM", "system-literal", + ] + assert_equal([declaration], + parse(<<-INTERNAL_SUBSET)) + + INTERNAL_SUBSET + end + + def test_public + declaration = [ + "%", + "name", + "PUBLIC", "public-literal", "system-literal", + ] + assert_equal([declaration], parse(<<-INTERNAL_SUBSET)) + + INTERNAL_SUBSET + end + end + end end end end -- cgit v1.2.3