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; }
size_t malloc_usable_size_impl(usable_ptr_t ptr) { if (MOZ_UNLIKELY(!replace_malloc_initialized)) init(); if (MOZ_LIKELY(!replace_malloc_usable_size)) return je_malloc_usable_size(ptr); return replace_malloc_usable_size(ptr); }
inline static void* fill_prefix(char* ptr) { uint32_t handle = skynet_current_handle(); size_t size = je_malloc_usable_size(ptr); uint32_t *p = (uint32_t *)(ptr + size - sizeof(uint32_t)); memcpy(p, &handle, sizeof(handle)); update_xmalloc_stat_alloc(handle, size); return ptr; }
inline static void* fill_prefix(char* ptr) { uint32_t handle = skynet_current_handle(); size_t size = je_malloc_usable_size(ptr); struct mem_cookie *p = (struct mem_cookie *)(ptr + size - sizeof(struct mem_cookie)); memcpy(&p->handle, &handle, sizeof(handle)); #ifdef MEMORY_CHECK uint32_t dogtag = MEMORY_ALLOCTAG; memcpy(&p->dogtag, &dogtag, sizeof(dogtag)); #endif update_xmalloc_stat_alloc(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; }