From 9b5a886ea6f0257198513417d1902bdb8f44f3ce 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");