void hwasan_free(void *ptr, StackTrace *stack) { #if HWASAN_WITH_INTERCEPTORS // A tag of 0 means that this is a system allocator allocation, so we must use // the system allocator to free it. if (!flags()->disable_allocator_tagging && GetTagFromPointer((uptr)ptr) == 0) return REAL(free)(ptr); #endif return HwasanDeallocate(stack, ptr); }
void *hwasan_realloc(void *ptr, uptr size, StackTrace *stack) { if (!ptr) return SetErrnoOnNull(HwasanAllocate(stack, size, sizeof(u64), false)); #if HWASAN_WITH_INTERCEPTORS // A tag of 0 means that this is a system allocator allocation, so we must use // the system allocator to realloc it. if (!flags()->disable_allocator_tagging && GetTagFromPointer((uptr)ptr) == 0) return REAL(realloc)(ptr, size); #endif if (size == 0) { HwasanDeallocate(stack, ptr); return nullptr; } return SetErrnoOnNull(HwasanReallocate(stack, ptr, size, sizeof(u64))); }
static void *HwasanReallocate(StackTrace *stack, void *tagged_ptr_old, uptr new_size, uptr alignment) { if (!PointerAndMemoryTagsMatch(tagged_ptr_old)) ReportInvalidFree(stack, reinterpret_cast<uptr>(tagged_ptr_old)); void *tagged_ptr_new = HwasanAllocate(stack, new_size, alignment, false /*zeroise*/); if (tagged_ptr_old && tagged_ptr_new) { void *untagged_ptr_old = UntagPtr(tagged_ptr_old); Metadata *meta = reinterpret_cast<Metadata *>(allocator.GetMetaData(untagged_ptr_old)); internal_memcpy(UntagPtr(tagged_ptr_new), untagged_ptr_old, Min(new_size, static_cast<uptr>(meta->requested_size))); HwasanDeallocate(stack, tagged_ptr_old); } return tagged_ptr_new; }