summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2020-04-16 12:14:38 -0700
committerMarco Nelissen <marcone@google.com>2020-04-16 12:14:38 -0700
commitc1aa8d1ad866aff14a2424179aa209bba806f799 (patch)
treee015a7073f265f45ca49b50c2ef5a7aba0747a9a
parent5eb6a7ee7b33dd34280ef5a0da88f4b47a0072f1 (diff)
downloadsonivox-c1aa8d1ad866aff14a2424179aa209bba806f799.tar.gz
Fix integer overflows
Bug: 154072749 Test: manual Change-Id: Ie9722a23e488f22d8e429b9db05975bf27c22d31
-rw-r--r--arm-wt-22k/lib_src/eas_wtengine.c6
-rw-r--r--arm-wt-22k/lib_src/eas_wtsynth.c7
2 files changed, 10 insertions, 3 deletions
diff --git a/arm-wt-22k/lib_src/eas_wtengine.c b/arm-wt-22k/lib_src/eas_wtengine.c
index a8ba361..c3012e5 100644
--- a/arm-wt-22k/lib_src/eas_wtengine.c
+++ b/arm-wt-22k/lib_src/eas_wtengine.c
@@ -60,6 +60,10 @@ extern void WT_Interpolate (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame);
extern void WT_VoiceFilter (S_FILTER_CONTROL*pFilter, S_WT_INT_FRAME *pWTIntFrame);
#endif
+// The PRNG in WT_NoiseGenerator relies on modulo math
+#undef NO_INT_OVERFLOW_CHECKS
+#define NO_INT_OVERFLOW_CHECKS __attribute__((no_sanitize("integer")))
+
#if defined(_OPTIMIZED_MONO) || !defined(NATIVE_EAS_KERNEL) || defined(_16_BIT_SAMPLES)
/*----------------------------------------------------------------------------
* WT_VoiceGain
@@ -436,7 +440,7 @@ void WT_VoiceFilter (S_FILTER_CONTROL *pFilter, S_WT_INT_FRAME *pWTIntFrame)
* or more.
*----------------------------------------------------------------------------
*/
- void WT_NoiseGenerator (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame)
+ void NO_INT_OVERFLOW_CHECKS WT_NoiseGenerator (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame)
{
EAS_PCM *pOutputBuffer;
EAS_I32 phaseInc;
diff --git a/arm-wt-22k/lib_src/eas_wtsynth.c b/arm-wt-22k/lib_src/eas_wtsynth.c
index 987170b..d3ca3af 100644
--- a/arm-wt-22k/lib_src/eas_wtsynth.c
+++ b/arm-wt-22k/lib_src/eas_wtsynth.c
@@ -540,7 +540,6 @@ static EAS_BOOL WT_UpdateVoice (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, S_SYNTH
if (pVoice->regionIndex & FLAG_RGN_IDX_DLS_SYNTH)
return DLS_UpdateVoice(pVoiceMgr, pSynth, pVoice, voiceNum, pMixBuffer, numSamples);
#endif
-
/* establish pointers to critical data */
pWTVoice = &pVoiceMgr->wtVoices[voiceNum];
pWTRegion = &pSynth->pEAS->pWTRegions[pVoice->regionIndex & REGION_INDEX_MASK];
@@ -575,7 +574,11 @@ static EAS_BOOL WT_UpdateVoice (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, S_SYNTH
else
temp += (pVoice->note + pSynth->globalTranspose) * 100;
intFrame.frame.phaseIncrement = WT_UpdatePhaseInc(pWTVoice, pArt, pChannel, temp);
- temp = pWTVoice->loopEnd - pWTVoice->loopStart;
+ if (pWTVoice->loopStart == WT_NOISE_GENERATOR) {
+ temp = 0;
+ } else {
+ temp = pWTVoice->loopEnd - pWTVoice->loopStart;
+ }
#ifdef _16_BIT_SAMPLES
temp >>= 1;
#endif