From 8fd97bee7fb618b758c8c9b61cdadc75feacdddb Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 14 Nov 2020 23:07:07 +0100 Subject: [PATCH] UserspaceEmulator: Forget ChunkedBlocks after they are munmap()'ed This is not ideal since we lose free() backtraces, but it will require some thinking to get this right. --- DevTools/UserspaceEmulator/MallocTracer.cpp | 8 ++++++++ DevTools/UserspaceEmulator/MallocTracer.h | 3 +++ DevTools/UserspaceEmulator/MmapRegion.cpp | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/DevTools/UserspaceEmulator/MallocTracer.cpp b/DevTools/UserspaceEmulator/MallocTracer.cpp index 83039adf26..9bc7aa3491 100644 --- a/DevTools/UserspaceEmulator/MallocTracer.cpp +++ b/DevTools/UserspaceEmulator/MallocTracer.cpp @@ -40,6 +40,14 @@ MallocTracer::MallocTracer() { } +void MallocTracer::notify_malloc_block_was_released(Badge, MmapRegion& region) +{ + // FIXME: It's sad that we may lose a bunch of free() backtraces here, + // but if the address is reused for a new ChunkedBlock, things will + // get extremely confused. + m_chunked_blocks.remove(region.base()); +} + void MallocTracer::target_did_malloc(Badge, FlatPtr address, size_t size) { auto* region = Emulator::the().mmu().find_region({ 0x20, address }); diff --git a/DevTools/UserspaceEmulator/MallocTracer.h b/DevTools/UserspaceEmulator/MallocTracer.h index aad1d66adb..290cd58a7c 100644 --- a/DevTools/UserspaceEmulator/MallocTracer.h +++ b/DevTools/UserspaceEmulator/MallocTracer.h @@ -34,6 +34,7 @@ namespace UserspaceEmulator { +class MmapRegion; class SoftCPU; class MallocTracer { @@ -44,6 +45,8 @@ public: void target_did_free(Badge, FlatPtr address); void target_did_realloc(Badge, FlatPtr address, size_t); + void notify_malloc_block_was_released(Badge, MmapRegion&); + void audit_read(FlatPtr address, size_t); void audit_write(FlatPtr address, size_t); diff --git a/DevTools/UserspaceEmulator/MmapRegion.cpp b/DevTools/UserspaceEmulator/MmapRegion.cpp index f0036f729c..a01d837082 100644 --- a/DevTools/UserspaceEmulator/MmapRegion.cpp +++ b/DevTools/UserspaceEmulator/MmapRegion.cpp @@ -58,6 +58,11 @@ MmapRegion::MmapRegion(u32 base, u32 size, int prot) MmapRegion::~MmapRegion() { + if (is_malloc_block()) { + if (auto* tracer = Emulator::the().malloc_tracer()) + tracer->notify_malloc_block_was_released({}, *this); + } + free(m_shadow_data); if (m_file_backed) munmap(m_data, size());