From 99647d6ff4cf35524a255e0fccf7239c670ed139 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 4 May 2011 09:31:21 -0400 Subject: [PATCH] XSLT::Stylesheet#transform no longer segfaults when handed a non-XML::Document. Closes #452 --- CHANGELOG.rdoc | 1 + ext/nokogiri/xslt_stylesheet.c | 2 ++ test/test_xslt_transforms.rb | 8 ++++++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc index f77e5a0db3..9f4a7661cf 100644 --- a/CHANGELOG.rdoc +++ b/CHANGELOG.rdoc @@ -56,6 +56,7 @@ * HTML::SAX::Parser should call back a block given to parse*() if any, just as XML::SAX::Parser does. * Add further encoding detection to HTML parser that libxml2 does not do. * Document#remove_namespaces! now handles attributes with namespaces. #396 + * XSLT::Stylesheet#transform no longer segfaults when handed a non-XML::Document. #452 === 1.4.4 / 2010-11-15 diff --git a/ext/nokogiri/xslt_stylesheet.c b/ext/nokogiri/xslt_stylesheet.c index 3cc5b1b8a2..7d443570a9 100644 --- a/ext/nokogiri/xslt_stylesheet.c +++ b/ext/nokogiri/xslt_stylesheet.c @@ -104,6 +104,8 @@ static VALUE transform(int argc, VALUE* argv, VALUE self) rb_scan_args(argc, argv, "11", &xmldoc, ¶mobj); if (NIL_P(paramobj)) { paramobj = rb_ary_new2(0L) ; } + if (!rb_obj_is_kind_of(xmldoc, cNokogiriXmlDocument)) + rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::Document"); /* handle hashes as arguments. */ if(T_HASH == TYPE(paramobj)) { diff --git a/test/test_xslt_transforms.rb b/test/test_xslt_transforms.rb index c0df6b5aeb..a57ba3a99a 100644 --- a/test/test_xslt_transforms.rb +++ b/test/test_xslt_transforms.rb @@ -1,7 +1,6 @@ require "helper" class TestXsltTransforms < Nokogiri::TestCase - def setup @doc = Nokogiri::XML(File.open(XML_FILE)) end @@ -179,11 +178,16 @@ def test_xslt_parse_error assert_raises(RuntimeError) { Nokogiri::XSLT.parse(xslt_str) } end + def test_passing_a_non_document_to_transform + xsl = Nokogiri::XSLT('') + assert_raises(ArgumentError) { xsl.transform("
") } + assert_raises(ArgumentError) { xsl.transform(Nokogiri::HTML("").css("body")) } + end + def check_params result_doc, params result_doc.xpath('/root/params/*').each do |p| assert_equal p.content, params[p.name.intern] end end - end end