diff options
Diffstat (limited to 'ptr_chck.c')
-rw-r--r-- | ptr_chck.c | 14 |
1 files changed, 8 insertions, 6 deletions
@@ -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) { |