From 77f4ff04d4408af0dcc0b55be184b61ea9daae72 Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Wed, 11 Jul 2018 23:09:00 +0300 Subject: Fix GC_is_valid_displacement and GC_is_visible for non-small objects * ptr_chck.c (GC_is_valid_displacement): Remove redundant IS_FORWARDING_ADDR_OR_NIL(hhdr) call if GC_all_interior_pointers. * ptr_chck.c (GC_is_valid_displacement): Do not goto fail if p+sz-offset > h+1 but IS_FORWARDING_ADDR_OR_NIL(HDR(h+1)). * ptr_chck.c (GC_is_visible): Transform comment about GC_base to a TODO item; set hhdr to HDR(base) instead of HDR(p) if HBLKPTR(base)!=HBLKPTR(p). --- ptr_chck.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'ptr_chck.c') diff --git a/ptr_chck.c b/ptr_chck.c index d41a0ad2..8b760af0 100644 --- a/ptr_chck.c +++ b/ptr_chck.c @@ -131,8 +131,7 @@ GC_API void * GC_CALL GC_is_valid_displacement(void *p) h = FORWARDED_ADDR(h, hhdr); hhdr = HDR(h); } - } - if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { + } else if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { goto fail; } sz = hhdr -> hb_sz; @@ -140,7 +139,8 @@ GC_API void * GC_CALL GC_is_valid_displacement(void *p) offset = pdispl % sz; if ((sz > MAXOBJBYTES && (word)p >= (word)h + sz) || !GC_valid_offsets[offset] - || (word)p - offset + sz > (word)(h + 1)) { + || ((word)p + (sz - offset) > (word)(h + 1) + && !IS_FORWARDING_ADDR_OR_NIL(HDR(h + 1)))) { goto fail; } return(p); @@ -215,10 +215,12 @@ GC_API void * GC_CALL GC_is_visible(void *p) } else { /* p points to the heap. */ word descr; - ptr_t base = (ptr_t)GC_base(p); /* Should be manually inlined? */ + ptr_t base = (ptr_t)GC_base(p); + /* TODO: should GC_base be manually inlined? */ - if (base == 0) goto fail; - if (HBLKPTR(base) != HBLKPTR(p)) hhdr = HDR((word)p); + if (NULL == base) goto fail; + if (HBLKPTR(base) != HBLKPTR(p)) + hhdr = HDR(base); descr = hhdr -> hb_descr; retry: switch(descr & GC_DS_TAGS) { -- cgit v1.2.1