From 932a471d3811d6d44764ce42b1b140a04961a763 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 16 Aug 2019 16:04:26 -0700 Subject: Directly mark compile options from the AST object `rb_ast_t` holds a reference to this object, so it should mark the object. Currently it is relying on the `mark_ary` on `node_buffer` to ensure that the object stays alive. But since the array internals can move, this could cause a segv if compaction impacts the array. --- parse.y | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'parse.y') diff --git a/parse.y b/parse.y index 0edbc565a4..ade2e0a941 100644 --- a/parse.y +++ b/parse.y @@ -5807,9 +5807,8 @@ yycompile0(VALUE arg) if (!opt) opt = rb_obj_hide(rb_ident_hash_new()); rb_hash_aset(opt, rb_sym_intern_ascii_cstr("coverage_enabled"), cov); prelude = block_append(p, p->eval_tree_begin, body); - add_mark_object(p, opt); tree->nd_body = prelude; - p->ast->body.compile_option = opt; + RB_OBJ_WRITE(p->ast, &p->ast->body.compile_option, opt); } p->ast->body.root = tree; p->ast->body.line_count = p->line_count; -- cgit v1.2.3