SPU: Fix array bounds overflow in register reads
This commit is contained in:
parent
777809b3b0
commit
e07d3c9db2
|
@ -258,12 +258,12 @@ u16 SPU::ReadRegister(u32 offset)
|
||||||
if (offset < (0x1F801D80 - SPU_BASE))
|
if (offset < (0x1F801D80 - SPU_BASE))
|
||||||
return ReadVoiceRegister(offset);
|
return ReadVoiceRegister(offset);
|
||||||
|
|
||||||
if (offset >= (0x1F801DC0 - SPU_BASE) && offset <= (0x1F801DFE - SPU_BASE))
|
if (offset >= (0x1F801DC0 - SPU_BASE) && offset < (0x1F801E00 - SPU_BASE))
|
||||||
return m_reverb_registers.rev[(offset - (0x1F801DC0 - SPU_BASE)) / 2];
|
return m_reverb_registers.rev[(offset - (0x1F801DC0 - SPU_BASE)) / 2];
|
||||||
|
|
||||||
if (offset >= (0x1F801E00 - SPU_BASE) && offset <= (0x1F801E60 - SPU_BASE))
|
if (offset >= (0x1F801E00 - SPU_BASE) && offset < (0x1F801E60 - SPU_BASE))
|
||||||
{
|
{
|
||||||
const u32 voice_index = offset - (0x1F801E00 - SPU_BASE);
|
const u32 voice_index = (offset - (0x1F801E00 - SPU_BASE)) / 4;
|
||||||
m_tick_event->InvokeEarly();
|
m_tick_event->InvokeEarly();
|
||||||
if (offset & 0x02)
|
if (offset & 0x02)
|
||||||
return m_voices[voice_index].left_volume.current_level;
|
return m_voices[voice_index].left_volume.current_level;
|
||||||
|
@ -518,7 +518,7 @@ void SPU::WriteRegister(u32 offset, u16 value)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offset >= (0x1F801DC0 - SPU_BASE) && offset <= (0x1F801DFE - SPU_BASE))
|
if (offset >= (0x1F801DC0 - SPU_BASE) && offset < (0x1F801DE0 - SPU_BASE))
|
||||||
{
|
{
|
||||||
const u32 reg = (offset - (0x1F801DC0 - SPU_BASE)) / 2;
|
const u32 reg = (offset - (0x1F801DC0 - SPU_BASE)) / 2;
|
||||||
Log_DebugPrintf("SPU reverb register %u <- 0x%04X", reg, value);
|
Log_DebugPrintf("SPU reverb register %u <- 0x%04X", reg, value);
|
||||||
|
@ -1290,7 +1290,7 @@ void SPU::Voice::DecodeBlock(const ADPCMBlock& block)
|
||||||
sample += (last_samples[1] * filter_neg) >> 6;
|
sample += (last_samples[1] * filter_neg) >> 6;
|
||||||
|
|
||||||
last_samples[1] = last_samples[0];
|
last_samples[1] = last_samples[0];
|
||||||
current_block_samples[i] = last_samples[0] = Clamp16(sample);
|
current_block_samples[i] = last_samples[0] = static_cast<s16>(Clamp16(sample));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::copy(last_samples, last_samples + countof(last_samples), adpcm_last_samples.begin());
|
std::copy(last_samples, last_samples + countof(last_samples), adpcm_last_samples.begin());
|
||||||
|
|
Loading…
Reference in New Issue