From 17dc5f7a9293dee8331c3079721e2e65a7065b28 Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 17 Nov 2020 16:47:39 +0000 Subject: [PATCH] MP3: Fail gracefully on unsupported mp3 formats --- .../codecs/juce_MP3AudioFormat.cpp | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp index 44bec28e3f..f355b644f5 100644 --- a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp @@ -492,7 +492,9 @@ struct MP3Frame return frequencies[sampleRateIndex]; } - void decodeHeader (const uint32 header) + enum class ParseSuccessful { no, yes }; + + ParseSuccessful decodeHeader (const uint32 header) { jassert (((header >> 10) & 3) != 3); @@ -527,17 +529,18 @@ struct MP3Frame jassertfalse; // This means the file is using "free format". Apparently very few decoders // support this mode, and this one certainly doesn't handle it correctly! frameSize = 0; + return ParseSuccessful::no; } - else + + switch (layer) { - switch (layer) - { - case 1: frameSize = (((frameSizes[lsf][0][bitrateIndex] * 12000) / getFrequency() + padding) * 4) - 4; break; - case 2: frameSize = (frameSizes[lsf][1][bitrateIndex] * 144000) / getFrequency() + (padding - 4); break; - case 3: frameSize = (bitrateIndex == 0) ? 0 : ((frameSizes[lsf][2][bitrateIndex] * 144000) / (getFrequency() << lsf) + (padding - 4)); break; - default: break; - } + case 1: frameSize = (((frameSizes[lsf][0][bitrateIndex] * 12000) / getFrequency() + padding) * 4) - 4; break; + case 2: frameSize = (frameSizes[lsf][1][bitrateIndex] * 144000) / getFrequency() + (padding - 4); break; + case 3: frameSize = (bitrateIndex == 0) ? 0 : ((frameSizes[lsf][2][bitrateIndex] * 144000) / (getFrequency() << lsf) + (padding - 4)); break; + default: break; } + + return ParseSuccessful::yes; } int layer, frameSize, numChannels, single; @@ -1430,7 +1433,11 @@ struct MP3Stream lastFrameSize += nextFrameOffset; } - frame.decodeHeader ((uint32) stream.readIntBigEndian()); + const auto successful = frame.decodeHeader ((uint32) stream.readIntBigEndian()); + + if (successful == MP3Frame::ParseSuccessful::no) + return -1; + headerParsed = true; frameSize = frame.frameSize; isFreeFormat = (frameSize == 0);