From de78cd0c065008b386bf25208f7db052e0d2ce33 Mon Sep 17 00:00:00 2001 From: Anthony Nicholls Date: Fri, 6 Oct 2023 11:41:16 +0100 Subject: [PATCH] AudioFormatReader: Add early return when numSamples <= 0 to prevent potential crashes --- modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp | 3 +++ modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp | 3 +++ .../juce_audio_formats/format/juce_AudioSubsectionReader.cpp | 3 +++ .../format/juce_BufferingAudioFormatReader.cpp | 3 +++ 4 files changed, 12 insertions(+) diff --git a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp index 1c6e052a22..ffafaaab40 100644 --- a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp @@ -834,6 +834,9 @@ public: clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, startSampleInFile, numSamples, lengthInSamples); + if (numSamples <= 0) + return true; + if (map == nullptr || ! mappedSection.contains (Range (startSampleInFile, startSampleInFile + numSamples))) { jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp index ff42cc1303..9d5def1746 100644 --- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp @@ -1858,6 +1858,9 @@ public: clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, startSampleInFile, numSamples, lengthInSamples); + if (numSamples <= 0) + return true; + if (map == nullptr || ! mappedSection.contains (Range (startSampleInFile, startSampleInFile + numSamples))) { jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. diff --git a/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp b/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp index 530c4bbca7..bd726e1e5b 100644 --- a/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp +++ b/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp @@ -56,6 +56,9 @@ bool AudioSubsectionReader::readSamples (int* const* destSamples, int numDestCha clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, startSampleInFile, numSamples, length); + if (numSamples <= 0) + return true; + return source->readSamples (destSamples, numDestChannels, startOffsetInDestBuffer, startSampleInFile + startSample, numSamples); } diff --git a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp index 1e4f031c9c..2253905bad 100644 --- a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp +++ b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp @@ -205,6 +205,9 @@ struct TestAudioFormatReader : public AudioFormatReader clearSamplesBeyondAvailableLength (destChannels, numDestChannels, startOffsetInDestBuffer, startSampleInFile, numSamples, lengthInSamples); + if (numSamples <= 0) + return true; + for (int j = 0; j < numDestChannels; ++j) { static_assert (sizeof (int) == sizeof (float),