From ffa20ef886f6c8f931b627c58a8d75d614aa2784 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 5 Jul 2023 01:03:11 -0400 Subject: [PATCH] fix: CDATA.new parameter type checks (cherry picked from commit 547c27c08d063b5a3de0e6d453ccee832fe29dad) --- ext/java/nokogiri/XmlCdata.java | 4 ++++ ext/nokogiri/xml_cdata.c | 6 ++++++ test/xml/test_cdata.rb | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/ext/java/nokogiri/XmlCdata.java b/ext/java/nokogiri/XmlCdata.java index 208bf9515c..e8eee55fc2 100644 --- a/ext/java/nokogiri/XmlCdata.java +++ b/ext/java/nokogiri/XmlCdata.java @@ -46,6 +46,10 @@ public class XmlCdata extends XmlText IRubyObject rbDocument = args[0]; content = args[1]; + if (!(rbDocument instanceof XmlNode)) { + String msg = "expected first parameter to be a Nokogiri::XML::Document, received " + rbDocument.getMetaClass(); + throw context.runtime.newTypeError(msg); + } if (!(rbDocument instanceof XmlDocument)) { // TODO: deprecate allowing Node context.runtime.getWarnings().warn("Passing a Node as the first parameter to CDATA.new is deprecated. Please pass a Document instead. This will become an error in a future release of Nokogiri."); diff --git a/ext/nokogiri/xml_cdata.c b/ext/nokogiri/xml_cdata.c index e7430a2cf0..eb7ac59e5c 100644 --- a/ext/nokogiri/xml_cdata.c +++ b/ext/nokogiri/xml_cdata.c @@ -25,6 +25,12 @@ rb_xml_cdata_s_new(int argc, VALUE *argv, VALUE klass) rb_scan_args(argc, argv, "2*", &rb_document, &rb_content, &rb_rest); + if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlNode)) { + rb_raise(rb_eTypeError, + "expected first parameter to be a Nokogiri::XML::Document, received %"PRIsVALUE, + rb_obj_class(rb_document)); + } + if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlDocument)) { xmlNodePtr deprecated_node_type_arg; // TODO: deprecate allowing Node diff --git a/test/xml/test_cdata.rb b/test/xml/test_cdata.rb index 830bfe5633..a50bce1745 100644 --- a/test/xml/test_cdata.rb +++ b/test/xml/test_cdata.rb @@ -40,6 +40,13 @@ assert_raises(TypeError) { Nokogiri::XML::CDATA.new(doc, 1.234) } assert_raises(TypeError) { Nokogiri::XML::CDATA.new(doc, {}) } end + + it "does not accept anything other than Node or Document" do + assert_raises(TypeError) { Nokogiri::XML::CDATA.new(1234, "hello world") } + assert_raises(TypeError) { Nokogiri::XML::CDATA.new("asdf", "hello world") }.inspect + assert_raises(TypeError) { Nokogiri::XML::CDATA.new({}, "hello world") } + assert_raises(TypeError) { Nokogiri::XML::CDATA.new(nil, "hello world") } + end end it "supports #content and #content=" do