From: <sv...@op...> - 2024-11-24 00:35:39
|
Author: sagamusix Date: Sun Nov 24 01:35:27 2024 New Revision: 22270 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22270 Log: Merged revision(s) 22224, 22230, 22241 from trunk/OpenMPT: [Fix] Avoid extremely loud sample and synth amplification outside of supported GUI parameters. Found with afl++ + ubsan. ........ [Fix] Avoid integer wraparound when period + fractional period exceeds 32-bit integer limits. Found with afl++ + ubsan. ........ [Fix] Also limit sample pre-amp to 2000 for formats where we retrieve it through other means than OpenMPT song extensions (e.g. MO3). Found with afl++ + ubsan. [Fix] Sanitize sample length and loop points for missing external samples as well. Otherwise invalid values might be used during seeking. Found with afl++ + ubsan. ........ Modified: branches/OpenMPT-1.28/ (props changed) branches/OpenMPT-1.28/soundlib/Load_it.cpp branches/OpenMPT-1.28/soundlib/Sndfile.cpp branches/OpenMPT-1.28/soundlib/Sndmix.cpp Modified: branches/OpenMPT-1.28/soundlib/Load_it.cpp ============================================================================== --- branches/OpenMPT-1.28/soundlib/Load_it.cpp Sun Nov 24 01:34:11 2024 (r22269) +++ branches/OpenMPT-1.28/soundlib/Load_it.cpp Sun Nov 24 01:35:27 2024 (r22270) @@ -2458,14 +2458,6 @@ if(m_nMixLevels >= mixLevelsMax) m_nMixLevels = mixLevelsOriginal; //m_dwCreatedWithVersion //m_dwLastSavedWithVersion - //m_nSamplePreAmp - //m_nVSTiVolume - //m_nDefaultGlobalVolume - LimitMax(m_nDefaultGlobalVolume, MAX_GLOBAL_VOLUME); - //m_nRestartPos - //m_ModFlags - LimitMax(m_nDefaultRowsPerBeat, MAX_ROWS_PER_BEAT); - LimitMax(m_nDefaultRowsPerMeasure, MAX_ROWS_PER_BEAT); } Modified: branches/OpenMPT-1.28/soundlib/Sndfile.cpp ============================================================================== --- branches/OpenMPT-1.28/soundlib/Sndfile.cpp Sun Nov 24 01:34:11 2024 (r22269) +++ branches/OpenMPT-1.28/soundlib/Sndfile.cpp Sun Nov 24 01:35:27 2024 (r22270) @@ -478,6 +478,8 @@ // Sanitize sample names mpt::String::SetNullTerminator(m_szNames[nSmp]); ModSample &sample = Samples[nSmp]; + LimitMax(sample.nLength, MAX_SAMPLE_LENGTH); + sample.SanitizeLoops(); #ifdef MPT_EXTERNAL_SAMPLES if(SampleHasPath(nSmp)) @@ -543,6 +545,8 @@ LimitMax(m_nDefaultRowsPerBeat, MAX_ROWS_PER_BEAT); LimitMax(m_nDefaultRowsPerMeasure, MAX_ROWS_PER_BEAT); LimitMax(m_nDefaultGlobalVolume, MAX_GLOBAL_VOLUME); + LimitMax(m_nSamplePreAmp, 2000); + LimitMax(m_nVSTiVolume, 2000); if(!m_tempoSwing.empty()) m_tempoSwing.resize(m_nDefaultRowsPerBeat); Modified: branches/OpenMPT-1.28/soundlib/Sndmix.cpp ============================================================================== --- branches/OpenMPT-1.28/soundlib/Sndmix.cpp Sun Nov 24 01:34:11 2024 (r22269) +++ branches/OpenMPT-1.28/soundlib/Sndmix.cpp Sun Nov 24 01:35:27 2024 (r22270) @@ -1774,8 +1774,15 @@ vdelta += Util::muldiv(period, fineUpTable[l & 0x03], 0x10000) - period; } } - period = (period + vdelta) / 256; - nPeriodFrac = vdelta & 0xFF; + if(Util::MaxValueOfType(period) - period >= vdelta) + { + period = (period + vdelta) / 256; + nPeriodFrac = vdelta & 0xFF; + } else + { + period = Util::MaxValueOfType(period) / 256; + nPeriodFrac = 0; + } } else { // MPT's autovibrato code |