From 85cb55cb84be4c8ce0be8cc525dd1eeaa6686d8b Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 21 Jul 2014 10:02:39 +0200 Subject: [PATCH] Check some addresses in sceAtracDecodeData --- Core/HLE/sceAtrac.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceAtrac.cpp b/Core/HLE/sceAtrac.cpp index f47ebc9826..ec635ff611 100644 --- a/Core/HLE/sceAtrac.cpp +++ b/Core/HLE/sceAtrac.cpp @@ -689,14 +689,23 @@ u32 _AtracDecodeData(int atracID, u8* outbuf, u32 *SamplesNum, u32* finish, int } u32 sceAtracDecodeData(int atracID, u32 outAddr, u32 numSamplesAddr, u32 finishFlagAddr, u32 remainAddr) { + int ret = -1; + if (!Memory::IsValidAddress(outAddr)) { + ERROR_LOG(ME, "%08x=sceAtracDecodeData(%i, %08x, ...): Bad out addr, skipping", ret, atracID, outAddr); + return SCE_KERNEL_ERROR_ILLEGAL_ADDR; + } + u32 numSamples = 0; u32 finish = 0; int remains = 0; - int ret = _AtracDecodeData(atracID, Memory::GetPointer(outAddr), &numSamples, &finish, &remains); + ret = _AtracDecodeData(atracID, Memory::GetPointer(outAddr), &numSamples, &finish, &remains); if (ret != (int)ATRAC_ERROR_BAD_ATRACID && ret != (int)ATRAC_ERROR_NO_DATA) { - Memory::Write_U32(numSamples, numSamplesAddr); - Memory::Write_U32(finish, finishFlagAddr); - Memory::Write_U32(remains, remainAddr); + if (Memory::IsValidAddress(numSamplesAddr)) + Memory::Write_U32(numSamples, numSamplesAddr); + if (Memory::IsValidAddress(finishFlagAddr)) + Memory::Write_U32(finish, finishFlagAddr); + if (Memory::IsValidAddress(remainAddr)) + Memory::Write_U32(remains, remainAddr); } DEBUG_LOG(ME, "%08x=sceAtracDecodeData(%i, %08x, %08x[%08x], %08x[%08x], %08x[%d])", ret, atracID, outAddr, numSamplesAddr, numSamples,