From dadf9d270ca3e750cfb46164e59f0cea6b9649ea Mon Sep 17 00:00:00 2001 From: Zephyron Date: Tue, 16 Dec 2025 16:24:15 +1000 Subject: [PATCH] fix(nvdrv): prevent infinite loop when SMMU address space is exhausted Fix crash in PinHandle when SMMU allocation fails and unmap queue is empty. Previously, the code would log an error and continue looping indefinitely, causing log spam and eventual crash. Now it returns 0 to fail gracefully. Also fix incorrect handle check on line 219 - should check freeHandleDesc instead of handle_description. Signed-off-by: Zephyron --- src/core/hle/service/nvdrv/core/nvmap.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/hle/service/nvdrv/core/nvmap.cpp b/src/core/hle/service/nvdrv/core/nvmap.cpp index 0ef3dca24..9f83f3627 100644 --- a/src/core/hle/service/nvdrv/core/nvmap.cpp +++ b/src/core/hle/service/nvdrv/core/nvmap.cpp @@ -1,5 +1,6 @@ // SPDX-FileCopyrightText: 2022 yuzu Emulator Project // SPDX-FileCopyrightText: 2022 Skyline Team and Contributors +// SPDX-FileCopyrightText: 2025 citron Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -216,10 +217,12 @@ DAddr NvMap::PinHandle(NvMap::Handle::Id handle, bool low_area_pin) { // Handles in the unmap queue are guaranteed not to be pinned so don't bother // checking if they are before unmapping std::scoped_lock freeLock(freeHandleDesc->mutex); - if (handle_description->d_address) + if (freeHandleDesc->d_address) UnmapHandle(*freeHandleDesc); } else { LOG_CRITICAL(Service_NVDRV, "Ran out of SMMU address space!"); + // Break out of the loop to prevent infinite spinning when no handles can be freed + return 0; } }