diff --git a/h_malloc.c b/h_malloc.c index 8ccb3b7..ffcf0e4 100644 --- a/h_malloc.c +++ b/h_malloc.c @@ -1762,7 +1762,7 @@ EXPORT size_t h_malloc_usable_size(H_MALLOC_USABLE_SIZE_CONST void *arg) { return 0; } - void *p = untag_pointer((void *) (uintptr_t) arg); + const void *p = untag_const_pointer(arg); if (p < get_slab_region_end() && p >= ro.slab_region_start) { thread_unseal_metadata(); diff --git a/memtag.h b/memtag.h index 89bff75..0ba4cbc 100644 --- a/memtag.h +++ b/memtag.h @@ -19,6 +19,15 @@ static inline void *untag_pointer(void *ptr) { #endif } +static inline const void *untag_const_pointer(const void *ptr) { +#ifdef HAS_ARM_MTE + const uintptr_t mask = UINTPTR_MAX >> 8; + return (const void *) ((uintptr_t) ptr & mask); +#else + return ptr; +#endif +} + static inline void *set_pointer_tag(void *ptr, u8 tag) { #ifdef HAS_ARM_MTE return (void *) (((uintptr_t) tag << 56) | (uintptr_t) untag_pointer(ptr));