From 030edbd513ce5b368fd5e6e665afe9f9051802cc Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 1 Aug 2020 09:13:45 +0200 Subject: [PATCH] UserspaceEmulator: Mark mmap regions as malloc blocks when mallocing We don't have to be clever at all to figure out which MmapRegions are malloc blocks, we can just mark the containing region as such when the emulated process performs a malloc! :^) --- DevTools/UserspaceEmulator/MallocTracer.cpp | 4 ++++ DevTools/UserspaceEmulator/MmapRegion.cpp | 7 ------- DevTools/UserspaceEmulator/MmapRegion.h | 4 +++- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/DevTools/UserspaceEmulator/MallocTracer.cpp b/DevTools/UserspaceEmulator/MallocTracer.cpp index 1fe405521d..441632826e 100644 --- a/DevTools/UserspaceEmulator/MallocTracer.cpp +++ b/DevTools/UserspaceEmulator/MallocTracer.cpp @@ -44,6 +44,10 @@ void MallocTracer::target_did_malloc(Badge, FlatPtr address, size_t siz ASSERT(region); ASSERT(region->is_mmap()); auto& mmap_region = static_cast(*region); + + // Mark the containing mmap region as a malloc block! + mmap_region.set_malloc(true); + auto* shadow_bits = mmap_region.shadow_data() + address - mmap_region.base(); memset(shadow_bits, 0, size); diff --git a/DevTools/UserspaceEmulator/MmapRegion.cpp b/DevTools/UserspaceEmulator/MmapRegion.cpp index 3abe4092e7..e507461c85 100644 --- a/DevTools/UserspaceEmulator/MmapRegion.cpp +++ b/DevTools/UserspaceEmulator/MmapRegion.cpp @@ -65,13 +65,6 @@ MmapRegion::~MmapRegion() free(m_data); } -bool MmapRegion::is_malloc_block() const -{ - // FIXME: This is obviously incomplete! - // We should somehow know which mmap regions are malloc blocks. - return !m_file_backed; -} - ValueWithShadow MmapRegion::read8(FlatPtr offset) { if (!is_readable()) { diff --git a/DevTools/UserspaceEmulator/MmapRegion.h b/DevTools/UserspaceEmulator/MmapRegion.h index a32c5271d9..8c088f7f8b 100644 --- a/DevTools/UserspaceEmulator/MmapRegion.h +++ b/DevTools/UserspaceEmulator/MmapRegion.h @@ -52,7 +52,8 @@ public: bool is_writable() const { return m_prot & PROT_WRITE; } bool is_executable() const { return m_prot & PROT_EXEC; } - bool is_malloc_block() const; + bool is_malloc_block() const { return m_malloc; } + void set_malloc(bool b) { m_malloc = b; } private: MmapRegion(u32 base, u32 size, int prot); @@ -62,6 +63,7 @@ private: u8* m_shadow_data { nullptr }; int m_prot { 0 }; bool m_file_backed { false }; + bool m_malloc { false }; }; }