From cf16f490687f3bd96737bb21091ce5f9e6220ba4 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 25 Dec 2022 12:29:13 +0100 Subject: [PATCH] PowerPC: Fix theoretically possible infinite loop in WriteToHardware `em_address + size` can overflow and become 0. It shouldn't happen with the kinds of memory mappings games use in practice, though. --- Source/Core/Core/PowerPC/MMU.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/PowerPC/MMU.cpp b/Source/Core/Core/PowerPC/MMU.cpp index 0b9501ab63..307b6bfcbf 100644 --- a/Source/Core/Core/PowerPC/MMU.cpp +++ b/Source/Core/Core/PowerPC/MMU.cpp @@ -8,6 +8,7 @@ #include #include +#include "Common/Align.h" #include "Common/Assert.h" #include "Common/BitUtils.h" #include "Common/CommonTypes.h" @@ -379,7 +380,9 @@ static void WriteToHardware(Memory::MemoryManager& memory, u32 em_address, const const u32 rotated_data = std::rotr(data, ((em_address & 0x3) + size) * 8); - for (u32 addr = em_address & ~0x7; addr < em_address + size; addr += 8) + const u32 start_addr = Common::AlignDown(em_address, 8); + const u32 end_addr = Common::AlignUp(em_address + size, 8); + for (u32 addr = start_addr; addr != end_addr; addr += 8) { WriteToHardware(memory, addr, rotated_data, 4); WriteToHardware(memory, addr + 4, rotated_data, 4);