UserspaceEmulator: Cache the location and size of "malloc" and "free"

This allows us to quickly skip some auditing checks while we're inside
malloc/free themselves.
This commit is contained in:
Andreas Kling 2020-07-16 00:23:02 +02:00
parent 862ab82c19
commit 67cdbe1925
2 changed files with 14 additions and 2 deletions

View file

@ -125,6 +125,14 @@ bool Emulator::load_elf()
});
m_cpu.set_eip(m_elf->image().entry().get());
auto malloc_symbol = m_elf->find_demangled_function("malloc");
auto free_symbol = m_elf->find_demangled_function("free");
m_malloc_symbol_start = malloc_symbol.value().value();
m_malloc_symbol_end = m_malloc_symbol_start + malloc_symbol.value().size();
m_free_symbol_start = free_symbol.value().value();
m_free_symbol_end = m_free_symbol_start + free_symbol.value().size();
return true;
}
@ -170,8 +178,7 @@ int Emulator::exec()
bool Emulator::is_in_malloc_or_free() const
{
auto symbol = m_elf->symbolicate(m_cpu.eip());
return symbol.starts_with("malloc") || symbol.starts_with("free");
return (m_cpu.eip() >= m_malloc_symbol_start && m_cpu.eip() < m_malloc_symbol_end) || (m_cpu.eip() >= m_free_symbol_start && m_cpu.eip() < m_free_symbol_end);
}
static pid_t s_pid = getpid();

View file

@ -117,6 +117,11 @@ private:
bool m_shutdown { false };
int m_exit_status { 0 };
FlatPtr m_malloc_symbol_start { 0 };
FlatPtr m_malloc_symbol_end { 0 };
FlatPtr m_free_symbol_start { 0 };
FlatPtr m_free_symbol_end { 0 };
};
}