summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/rexml/parsers/baseparser.rb4
-rw-r--r--test/rexml/parse/test_element.rb13
2 files changed, 17 insertions, 0 deletions
diff --git a/lib/rexml/parsers/baseparser.rb b/lib/rexml/parsers/baseparser.rb
index 39e9ec3fb1..f76aed0787 100644
--- a/lib/rexml/parsers/baseparser.rb
+++ b/lib/rexml/parsers/baseparser.rb
@@ -335,6 +335,10 @@ module REXML
@nsstack.shift
last_tag = @tags.pop
md = @source.match( CLOSE_MATCH, true )
+ if md and !last_tag
+ message = "Unexpected top-level end tag (got '#{md[1]}')"
+ raise REXML::ParseException.new(message, @source)
+ end
if md.nil? or last_tag != md[1]
message = "Missing end tag for '#{last_tag}'"
message << " (got '#{md[1]}')" if md
diff --git a/test/rexml/parse/test_element.rb b/test/rexml/parse/test_element.rb
index aad915fe7b..7322e0eb4e 100644
--- a/test/rexml/parse/test_element.rb
+++ b/test/rexml/parse/test_element.rb
@@ -8,6 +8,19 @@ module REXMLTests
end
class TestInvalid < self
+ def test_top_level_end_tag
+ exception = assert_raise(REXML::ParseException) do
+ parse("</a>")
+ end
+ assert_equal(<<-DETAIL.chomp, exception.to_s)
+Unexpected top-level end tag (got 'a')
+Line: 1
+Position: 4
+Last 80 unconsumed characters:
+
+ DETAIL
+ end
+
def test_no_end_tag
exception = assert_raise(REXML::ParseException) do
parse("<a></")