Skip to content

Commit

Permalink
FIX(plugins): Load correct pages for modules
Browse files Browse the repository at this point in the history
This `VirtualQueryEx()` loop is called for each module in a
process. It reads pages starting at the module address but seems to
continue past into other modules and into dynamic allocations also.

This check stops enumerating pages once it encounters one that no longer
belongs to the module for which pages are being collected.

(Also this function opens two handles, this adds a clean up for the
first handle if opening the second fails.)

Fixes mumble-voip#6558
  • Loading branch information
sqwishy committed Oct 4, 2024
1 parent 7ef9b74 commit 1498b83
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion plugins/HostWindows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ Modules HostWindows::modules() const {

const auto snapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, m_pid);
if (snapshotHandle == INVALID_HANDLE_VALUE) {
CloseHandle(processHandle);
return {};
}

Expand All @@ -49,7 +50,11 @@ Modules HostWindows::modules() const {
MEMORY_BASIC_INFORMATION64 mbi;
auto address = reinterpret_cast< procptr_t >(me.modBaseAddr);
while (VirtualQueryEx(processHandle, reinterpret_cast< LPCVOID >(address),
reinterpret_cast< PMEMORY_BASIC_INFORMATION >(&mbi), sizeof(mbi))) {
reinterpret_cast< PMEMORY_BASIC_INFORMATION >(&mbi), sizeof(mbi))
/* Only enumerate pages that belong to the allocation for this module.
* This stops if it sees a page for a different allocation, belonging
* to another module or dynamic memory, or gap between pages. */
&& (mbi.AllocationBase == reinterpret_cast< procptr_t >(me.modBaseAddr))) {
MemoryRegion region{};
region.address = address;
region.size = mbi.RegionSize;
Expand Down

0 comments on commit 1498b83

Please sign in to comment.