From d3392340510052e62c6a67087039712d70c1e7fa Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Tue, 17 Nov 2020 12:22:15 -0800 Subject: [PATCH] Register all global VALUES as mark objects Previously it was possible for these objects to be garbage collected (the constants could be unassigned in Ruby) or moved as part of GC compaction (reproducible with GC.verify_compaction_references). This commit marks all the global variables in nokogumbo.c using rb_gc_register_mark_object to ensure that they can't be moved. --- ext/nokogumbo/nokogumbo.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ext/nokogumbo/nokogumbo.c b/ext/nokogumbo/nokogumbo.c index 674f9eb5..aedc6d6e 100644 --- a/ext/nokogumbo/nokogumbo.c +++ b/ext/nokogumbo/nokogumbo.c @@ -724,10 +724,15 @@ void Init_nokogumbo() { VALUE mNokogiri = rb_const_get(rb_cObject, rb_intern_const("Nokogiri")); VALUE mNokogiriXml = rb_const_get(mNokogiri, rb_intern_const("XML")); cNokogiriXmlSyntaxError = rb_const_get(mNokogiriXml, rb_intern_const("SyntaxError")); + rb_gc_register_mark_object(cNokogiriXmlSyntaxError); cNokogiriXmlElement = rb_const_get(mNokogiriXml, rb_intern_const("Element")); + rb_gc_register_mark_object(cNokogiriXmlElement); cNokogiriXmlText = rb_const_get(mNokogiriXml, rb_intern_const("Text")); + rb_gc_register_mark_object(cNokogiriXmlText); cNokogiriXmlCData = rb_const_get(mNokogiriXml, rb_intern_const("CDATA")); + rb_gc_register_mark_object(cNokogiriXmlCData); cNokogiriXmlComment = rb_const_get(mNokogiriXml, rb_intern_const("Comment")); + rb_gc_register_mark_object(cNokogiriXmlComment); // Interned symbols. new = rb_intern_const("new"); @@ -740,6 +745,7 @@ void Init_nokogumbo() { // Class constants. VALUE HTML5 = rb_const_get(mNokogiri, rb_intern_const("HTML5")); Document = rb_const_get(HTML5, rb_intern_const("Document")); + rb_gc_register_mark_object(Document); // Interned symbols. internal_subset = rb_intern_const("internal_subset");