summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2020-09-28 08:37:09 -0700
committerAaron Patterson <tenderlove@ruby-lang.org>2020-09-28 09:45:04 -0700
commit664eeda66e1f64d09e0d321e681f2c21916f9c13 (patch)
treeec81da6da774d9d62aef84df816dcbc2c58e1a0c /gc.c
parent0767d387ecb9e9dd7ebd34cad46d86cfce13b9f5 (diff)
Fix ASAN errors when updating call cache
Invalidating call cache walks the heap, so we need to take care to un-poison objects when examining them
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/gc.c b/gc.c
index fcb9c6454e..075019a315 100644
--- a/gc.c
+++ b/gc.c
@@ -2544,6 +2544,8 @@ vm_ccs_free(struct rb_class_cc_entries *ccs, int alive, rb_objspace_t *objspace,
for (int i=0; i<ccs->len; i++) {
const struct rb_callcache *cc = ccs->entries[i].cc;
if (!alive) {
+ void *ptr = asan_poisoned_object_p((VALUE)cc);
+ asan_unpoison_object((VALUE)cc, false);
// ccs can be free'ed.
if (is_pointer_to_heap(objspace, (void *)cc) &&
IMEMO_TYPE_P(cc, imemo_callcache) &&
@@ -2551,8 +2553,14 @@ vm_ccs_free(struct rb_class_cc_entries *ccs, int alive, rb_objspace_t *objspace,
// OK. maybe target cc.
}
else {
+ if (ptr) {
+ asan_poison_object((VALUE)cc);
+ }
continue;
}
+ if (ptr) {
+ asan_poison_object((VALUE)cc);
+ }
}
vm_cc_invalidate(cc);
}