inline static void* clean_prefix(char* ptr) { size_t size = je_malloc_usable_size(ptr); uint32_t *p = (uint32_t *)(ptr + size - sizeof(uint32_t)); uint32_t handle; memcpy(&handle, p, sizeof(handle)); update_xmalloc_stat_free(handle, size); return ptr; }
inline static void* clean_prefix(char* ptr) { size_t size = je_malloc_usable_size(ptr); struct mem_cookie *p = (struct mem_cookie *)(ptr + size - sizeof(struct mem_cookie)); uint32_t handle; memcpy(&handle, &p->handle, sizeof(handle)); #ifdef MEMORY_CHECK uint32_t dogtag; memcpy(&dogtag, &p->dogtag, sizeof(dogtag)); if (dogtag == MEMORY_FREETAG) { fprintf(stderr, "xmalloc: double free in :%08x\n", handle); } assert(dogtag == MEMORY_ALLOCTAG); // memory out of bounds dogtag = MEMORY_FREETAG; memcpy(&p->dogtag, &dogtag, sizeof(dogtag)); #endif update_xmalloc_stat_free(handle, size); return ptr; }