Skip to content

Commit 6777008

Browse files
committed
eliminate eval from Builder#initialize
which was raised by Rubocop's security filter related to #1915
1 parent 47a7bc7 commit 6777008

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

lib/nokogiri/xml/builder.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,13 @@ def initialize(options = {}, root = nil, &block)
268268
@doc = root.document
269269
@parent = root
270270
else
271-
namespace = self.class.name.split("::")
272-
namespace[-1] = "Document"
273-
@doc = eval(namespace.join("::")).new
274-
@parent = @doc
271+
klassname = "::" + (self.class.name.split("::")[0..-2] + ["Document"]).join("::")
272+
klass = begin
273+
Object.const_get(klassname)
274+
rescue NameError
275+
Nokogiri::XML::Document
276+
end
277+
@parent = @doc = klass.new
275278
end
276279

277280
@context = nil

test/xml/test_builder.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,17 @@ def test_builder_reuses_namespaces
342342
assert_equal envelope.namespace.object_id, package.namespace.object_id
343343
end
344344

345+
def test_builder_uses_proper_document_class
346+
xml_builder = Nokogiri::XML::Builder.new
347+
assert_instance_of Nokogiri::XML::Document, xml_builder.doc
348+
349+
html_builder = Nokogiri::HTML::Builder.new
350+
assert_instance_of Nokogiri::HTML::Document, html_builder.doc
351+
352+
foo_builder = ThisIsATestBuilder.new
353+
assert_instance_of Nokogiri::XML::Document, foo_builder.doc
354+
end
355+
345356
private
346357

347358
def namespaces_defined_on(node)
@@ -350,3 +361,7 @@ def namespaces_defined_on(node)
350361
end
351362
end
352363
end
364+
365+
class ThisIsATestBuilder < Nokogiri::XML::Builder
366+
# this exists for the test_builder_uses_proper_document_class and should be empty
367+
end

0 commit comments

Comments
 (0)