From 3ce991f9d2a68d05d222b90871fdfe0436dfd28b Mon Sep 17 00:00:00 2001 From: Stephen Miller Date: Thu, 1 May 2025 22:01:13 -0500 Subject: [PATCH] Fix VirtualQuery behavior on low addresses. --- src/core/libraries/kernel/memory.cpp | 3 --- src/core/memory.cpp | 10 +++++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/core/libraries/kernel/memory.cpp b/src/core/libraries/kernel/memory.cpp index 8a0c91479..4bffe2e34 100644 --- a/src/core/libraries/kernel/memory.cpp +++ b/src/core/libraries/kernel/memory.cpp @@ -126,9 +126,6 @@ s32 PS4_SYSV_ABI sceKernelAvailableDirectMemorySize(u64 searchStart, u64 searchE s32 PS4_SYSV_ABI sceKernelVirtualQuery(const void* addr, int flags, OrbisVirtualQueryInfo* info, size_t infoSize) { LOG_INFO(Kernel_Vmm, "called addr = {}, flags = {:#x}", fmt::ptr(addr), flags); - if (!addr) { - return ORBIS_KERNEL_ERROR_EACCES; - } auto* memory = Core::Memory::Instance(); return memory->VirtualQuery(std::bit_cast(addr), flags, info); } diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 494ffa70c..834f46495 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -571,7 +571,15 @@ int MemoryManager::VirtualQuery(VAddr addr, int flags, ::Libraries::Kernel::OrbisVirtualQueryInfo* info) { std::scoped_lock lk{mutex}; - auto it = FindVMA(addr); + // FindVMA on addresses before the vma_map return garbage data. + auto query_addr = addr < impl.SystemManagedVirtualBase() ? + impl.SystemManagedVirtualBase() : addr; + if (addr < query_addr && flags == 0) { + LOG_WARNING(Kernel_Vmm, "VirtualQuery on free memory region"); + return ORBIS_KERNEL_ERROR_EACCES; + } + auto it = FindVMA(query_addr); + if (it->second.type == VMAType::Free && flags == 1) { ++it; }