merge revision(s) 59033,59034: [Backport #13636]

rexml: add close tag check on end of document to StreamParser

	[ruby-core:81593] [Bug #13636]

	Reported by Anton Sivakov. Thanks!!!

	* properties.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@59399 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2017-07-23 07:33:07 +00:00
parent acfaa3311c
commit 3fd2cbecff
3 changed files with 41 additions and 1 deletions

View file

@ -7,6 +7,7 @@ module REXML
def initialize source, listener
@listener = listener
@parser = BaseParser.new( source )
@tag_stack = []
end
def add_listener( listener )
@ -19,14 +20,21 @@ module REXML
event = @parser.pull
case event[0]
when :end_document
unless @tag_stack.empty?
tag_path = "/" + @tag_stack.join("/")
raise ParseException.new("Missing end tag for '#{tag_path}'",
@parser.source)
end
return
when :start_element
@tag_stack << event[1]
attrs = event[2].each do |n, v|
event[2][n] = @parser.unnormalize( v )
end
@listener.tag_start( event[1], attrs )
when :end_element
@listener.tag_end( event[1] )
@tag_stack.pop
when :text
normalized = @parser.unnormalize( event[1] )
@listener.text( normalized )

View file

@ -0,0 +1,32 @@
require "test/unit"
require "rexml/document"
require "rexml/streamlistener"
module REXMLTests
class TestStreamParser < Test::Unit::TestCase
class NullListener
include REXML::StreamListener
end
class TestInvalid < self
def test_no_end_tag
xml = "<root><sub>"
exception = assert_raise(REXML::ParseException) do
parse(xml)
end
assert_equal(<<-MESSAGE, exception.to_s)
Missing end tag for '/root/sub'
Line: 1
Position: #{xml.bytesize}
Last 80 unconsumed characters:
MESSAGE
end
private
def parse(xml, listener=nil)
listener ||= NullListener.new
REXML::Document.parse_stream(xml, listener)
end
end
end
end

View file

@ -1,6 +1,6 @@
#define RUBY_VERSION "2.4.2"
#define RUBY_RELEASE_DATE "2017-07-23"
#define RUBY_PATCHLEVEL 150
#define RUBY_PATCHLEVEL 151
#define RUBY_RELEASE_YEAR 2017
#define RUBY_RELEASE_MONTH 7