From 56c6dde9c51fc86b3a41bd4b3549bd1b3c35b983 Mon Sep 17 00:00:00 2001 From: dearblue Date: Wed, 8 Jun 2022 22:10:58 +0900 Subject: [PATCH] Asigns table properties after `mrb_calloc()` If GC occurs in `mrb_calloc()` called by `iv_rehash()` or `mt_rehash()`, the object as table data may be destroyed. --- src/class.c | 2 +- src/variable.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class.c b/src/class.c index 3c2033251..28e21a3fe 100644 --- a/src/class.c +++ b/src/class.c @@ -73,9 +73,9 @@ mt_rehash(mrb_state *mrb, mt_tbl *t) khash_power2(new_alloc); if (old_alloc == new_alloc) return; + t->ptr = (union mt_ptr*)mrb_calloc(mrb, sizeof(union mt_ptr)+sizeof(mrb_sym), new_alloc); t->alloc = new_alloc; t->size = 0; - t->ptr = (union mt_ptr*)mrb_calloc(mrb, sizeof(union mt_ptr)+sizeof(mrb_sym), new_alloc); if (old_alloc == 0) return; mrb_sym *keys = (mrb_sym*)&old_ptr[old_alloc]; diff --git a/src/variable.c b/src/variable.c index 365d93034..68d3a388d 100644 --- a/src/variable.c +++ b/src/variable.c @@ -49,9 +49,9 @@ iv_rehash(mrb_state *mrb, iv_tbl *t) khash_power2(new_alloc); if (old_alloc == new_alloc) return; + t->ptr = (mrb_value*)mrb_calloc(mrb, sizeof(mrb_value)+sizeof(mrb_sym), new_alloc); t->size = 0; t->alloc = new_alloc; - t->ptr = (mrb_value*)mrb_calloc(mrb, sizeof(mrb_value)+sizeof(mrb_sym), new_alloc); if (old_alloc == 0) return; mrb_sym *keys = (mrb_sym*)&old_ptr[old_alloc];