From 3375c1f9be3aabf914cdb8254bdef994effc4deb Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 6 Dec 2022 01:51:37 -0500 Subject: [PATCH] fix: XML::Reader#attribute_hash returns nil on error This restores the behavior from v1.13.7 --- ext/nokogiri/xml_reader.c | 4 ++++ test/xml/test_reader.rb | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/ext/nokogiri/xml_reader.c b/ext/nokogiri/xml_reader.c index 022f8ff531..0895ea6a72 100644 --- a/ext/nokogiri/xml_reader.c +++ b/ext/nokogiri/xml_reader.c @@ -212,6 +212,10 @@ rb_xml_reader_attribute_hash(VALUE rb_reader) } c_node = xmlTextReaderExpand(c_reader); + if (c_node == NULL) { + return Qnil; + } + c_property = c_node->properties; while (c_property != NULL) { VALUE rb_name = NOKOGIRI_STR_NEW2(c_property->name); diff --git a/test/xml/test_reader.rb b/test/xml/test_reader.rb index ab119656c7..c0813efc15 100644 --- a/test/xml/test_reader.rb +++ b/test/xml/test_reader.rb @@ -681,6 +681,30 @@ def test_nonexistent_attribute reader.read # el assert_nil(reader.attribute("other")) end + + def test_broken_markup_attribute_hash + xml = <<~XML + + XML + reader = Nokogiri::XML::Reader(xml) + reader.read # root + reader.read # foo + + assert_equal("foo", reader.name) + assert_nil(reader.attribute_hash) + end + + def test_broken_markup_namespaces + xml = <<~XML + + XML + reader = Nokogiri::XML::Reader(xml) + reader.read # root + reader.read # foo + + assert_equal("foo", reader.name) + assert_nil(reader.namespaces) + end end end end