From dbe419a4923603e376d8b74547810df3802f0058 Mon Sep 17 00:00:00 2001 From: Uwe Klotz Date: Mon, 30 Dec 2019 12:44:45 +0100 Subject: [PATCH] Prevent infinite loop when decoding corrupt MP3 files --- CHANGELOG | 3 +++ src/sources/soundsourcemp3.cpp | 21 +++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7edaf0e5a857..1b887857eee2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +==== 2.2.4 2020-mm-dd ==== +* Prevent infinite loop when decoding corrupt MP3 files #2417 + ==== 2.2.3 2019-11-24 ==== * Don't make users reconfigure sound hardware when it has not changed #2253 * Fix MusicBrainz metadata lookup lp:1848887 #2328 diff --git a/src/sources/soundsourcemp3.cpp b/src/sources/soundsourcemp3.cpp index a4d1d89cbbef..848a97dc0da0 100644 --- a/src/sources/soundsourcemp3.cpp +++ b/src/sources/soundsourcemp3.cpp @@ -565,6 +565,7 @@ ReadableSampleFrames SoundSourceMp3::readSampleFramesClamped( CSAMPLE* pSampleBuffer = writableSampleFrames.writableData(); SINT numberOfFramesRemaining = numberOfFramesTotal; + SINT retryFrameIndex = numberOfFramesTotal; while (0 < numberOfFramesRemaining) { bool abortReading = false; @@ -645,11 +646,23 @@ ReadableSampleFrames SoundSourceMp3::readSampleFramesClamped( } } if (pMadThisFrame == m_madStream.this_frame) { - if (kLogger.debugEnabled()) { - kLogger.debug() << "Retry decoding MP3 frame @" << m_curFrameIndex; + // Retry decoding, but only once for each position to + // prevent infinite loops when decoding corrupt files + if (retryFrameIndex != m_curFrameIndex) { + retryFrameIndex = m_curFrameIndex; + if (kLogger.debugEnabled()) { + kLogger.debug() + << "Retry decoding MP3 frame @" + << m_curFrameIndex; + } + continue; + } else { + kLogger.warning() + << "Decoding MP3 frame @" + << m_curFrameIndex + << "failed again"; + break; } - // Retry decoding - continue; } DEBUG_ASSERT(isStreamValid(m_madStream));