From 3f392d3be7b79c29f0389430d3815e3d7f635d28 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 25 Apr 2023 23:09:42 +0200 Subject: [PATCH] Rx channel demods: prevent possible reading past audio buffer end - take 2. For #1661 --- plugins/channelrx/demodam/amdemodsink.cpp | 4 ++-- plugins/channelrx/demodam/amdemodsink.h | 2 +- plugins/channelrx/demodbfm/bfmdemodsink.cpp | 4 ++-- plugins/channelrx/demodbfm/bfmdemodsink.h | 2 +- plugins/channelrx/demoddab/dabdemodsink.cpp | 4 ++-- plugins/channelrx/demoddab/dabdemodsink.h | 2 +- plugins/channelrx/demoddsd/dsddemodsink.cpp | 1 - plugins/channelrx/demoddsd/dsddemodsink.h | 1 - plugins/channelrx/demodfreedv/freedvdemodsink.cpp | 4 ++-- plugins/channelrx/demodfreedv/freedvdemodsink.h | 2 +- plugins/channelrx/demodils/ilsdemodsink.cpp | 4 ++-- plugins/channelrx/demodils/ilsdemodsink.h | 2 +- plugins/channelrx/demodm17/m17demodprocessor.cpp | 4 ++-- plugins/channelrx/demodm17/m17demodprocessor.h | 2 +- plugins/channelrx/demodm17/m17demodsink.cpp | 1 - plugins/channelrx/demodm17/m17demodsink.h | 1 - plugins/channelrx/demodnfm/nfmdemodsink.cpp | 4 ++-- plugins/channelrx/demodnfm/nfmdemodsink.h | 2 +- plugins/channelrx/demodssb/ssbdemodsink.cpp | 4 ++-- plugins/channelrx/demodssb/ssbdemodsink.h | 2 +- plugins/channelrx/demodvor/vordemodsink.cpp | 4 ++-- plugins/channelrx/demodvor/vordemodsink.h | 2 +- plugins/channelrx/demodwfm/wfmdemodsink.cpp | 4 ++-- plugins/channelrx/demodwfm/wfmdemodsink.h | 2 +- plugins/channelrx/udpsink/udpsinksink.cpp | 4 ++-- plugins/channelrx/udpsink/udpsinksink.h | 2 +- 26 files changed, 33 insertions(+), 37 deletions(-) diff --git a/plugins/channelrx/demodam/amdemodsink.cpp b/plugins/channelrx/demodam/amdemodsink.cpp index 4e3cdea83..66f195a5a 100644 --- a/plugins/channelrx/demodam/amdemodsink.cpp +++ b/plugins/channelrx/demodam/amdemodsink.cpp @@ -203,11 +203,11 @@ void AMDemodSink::processOneSample(Complex &ci) if (m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std:;size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_audioBuffer.size())); if (res != m_audioBufferFill) { - qDebug("AMDemodSink::processOneSample: %u/%u audio samples written", res, m_audioBufferFill); + qDebug("AMDemodSink::processOneSample: %lu/%lu audio samples written", res, m_audioBufferFill); m_audioFifo.clear(); } diff --git a/plugins/channelrx/demodam/amdemodsink.h b/plugins/channelrx/demodam/amdemodsink.h index b9f61eb15..3786086ba 100644 --- a/plugins/channelrx/demodam/amdemodsink.h +++ b/plugins/channelrx/demodam/amdemodsink.h @@ -124,7 +124,7 @@ private: AudioVector m_audioBuffer; AudioFifo m_audioFifo; - uint32_t m_audioBufferFill; + std::size_t m_audioBufferFill; QVector m_demodBuffer; int m_demodBufferFill; diff --git a/plugins/channelrx/demodbfm/bfmdemodsink.cpp b/plugins/channelrx/demodbfm/bfmdemodsink.cpp index e22acd0e2..bddcced6a 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsink.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodsink.cpp @@ -225,10 +225,10 @@ void BFMDemodSink::feed(const SampleVector::const_iterator& begin, const SampleV if (m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_audioBuffer.size())); if(res != m_audioBufferFill) { - qDebug("BFMDemodSink::feed: %u/%u audio samples written", res, m_audioBufferFill); + qDebug("BFMDemodSink::feed: %lu/%lu audio samples written", res, m_audioBufferFill); } m_audioBufferFill = 0; diff --git a/plugins/channelrx/demodbfm/bfmdemodsink.h b/plugins/channelrx/demodbfm/bfmdemodsink.h index c2c4ffa8d..c95d26aad 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsink.h +++ b/plugins/channelrx/demodbfm/bfmdemodsink.h @@ -114,7 +114,7 @@ private: int m_audioSampleRate; AudioVector m_audioBuffer; - uint m_audioBufferFill; + std::size_t m_audioBufferFill; AudioFifo m_audioFifo; SampleVector m_sampleBuffer; diff --git a/plugins/channelrx/demoddab/dabdemodsink.cpp b/plugins/channelrx/demoddab/dabdemodsink.cpp index f73e4a59a..b4a6ffd97 100644 --- a/plugins/channelrx/demoddab/dabdemodsink.cpp +++ b/plugins/channelrx/demoddab/dabdemodsink.cpp @@ -446,11 +446,11 @@ void DABDemodSink::processOneAudioSample(Complex &ci) if (m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_audioBuffer.size())); if (res != m_audioBufferFill) { - qDebug("DABDemodSink::audio: %u/%u audio samples written", res, m_audioBufferFill); + qDebug("DABDemodSink::audio: %lu/%lu audio samples written", res, m_audioBufferFill); m_audioFifo.clear(); } diff --git a/plugins/channelrx/demoddab/dabdemodsink.h b/plugins/channelrx/demoddab/dabdemodsink.h index 153f96969..2cb6402ec 100644 --- a/plugins/channelrx/demoddab/dabdemodsink.h +++ b/plugins/channelrx/demoddab/dabdemodsink.h @@ -140,7 +140,7 @@ private: Real m_audioInterpolatorDistanceRemain; AudioVector m_audioBuffer; AudioFifo m_audioFifo; - uint32_t m_audioBufferFill; + std::size_t m_audioBufferFill; QVector m_demodBuffer; int m_demodBufferFill; diff --git a/plugins/channelrx/demoddsd/dsddemodsink.cpp b/plugins/channelrx/demoddsd/dsddemodsink.cpp index 3a43e6583..5e55cd326 100644 --- a/plugins/channelrx/demoddsd/dsddemodsink.cpp +++ b/plugins/channelrx/demoddsd/dsddemodsink.cpp @@ -64,7 +64,6 @@ DSDDemodSink::DSDDemodSink() : m_signalFormat(signalFormatNone) { m_audioBuffer.resize(1<<14); - m_audioBufferFill = 0; m_demodBuffer.resize(1<<12); m_demodBufferFill = 0; diff --git a/plugins/channelrx/demoddsd/dsddemodsink.h b/plugins/channelrx/demoddsd/dsddemodsink.h index a9dd2780b..e3e4fcd41 100644 --- a/plugins/channelrx/demoddsd/dsddemodsink.h +++ b/plugins/channelrx/demoddsd/dsddemodsink.h @@ -141,7 +141,6 @@ private: SampleVector m_scopeSampleBuffer; AudioVector m_audioBuffer; - uint m_audioBufferFill; FixReal *m_sampleBuffer; //!< samples ring buffer int m_sampleBufferIndex; int m_scaleFromShort; diff --git a/plugins/channelrx/demodfreedv/freedvdemodsink.cpp b/plugins/channelrx/demodfreedv/freedvdemodsink.cpp index fdbcd0422..25033d185 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodsink.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemodsink.cpp @@ -330,10 +330,10 @@ void FreeDVDemodSink::pushSampleToAudio(int16_t sample) if (m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_audioBuffer.size())); if (res != m_audioBufferFill) { - qDebug("FreeDVDemodSink::pushSampleToAudio: %u/%u samples written", res, m_audioBufferFill); + qDebug("FreeDVDemodSink::pushSampleToAudio: %lu/%lu samples written", res, m_audioBufferFill); } m_audioBufferFill = 0; diff --git a/plugins/channelrx/demodfreedv/freedvdemodsink.h b/plugins/channelrx/demodfreedv/freedvdemodsink.h index a9a8ad0bf..6a8446c19 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodsink.h +++ b/plugins/channelrx/demodfreedv/freedvdemodsink.h @@ -182,7 +182,7 @@ private: SampleVector m_sampleBuffer; AudioVector m_audioBuffer; - uint m_audioBufferFill; + std::size_t m_audioBufferFill; AudioFifo m_audioFifo; struct freedv *m_freeDV; diff --git a/plugins/channelrx/demodils/ilsdemodsink.cpp b/plugins/channelrx/demodils/ilsdemodsink.cpp index cbb9b629d..9f0a1ac45 100644 --- a/plugins/channelrx/demodils/ilsdemodsink.cpp +++ b/plugins/channelrx/demodils/ilsdemodsink.cpp @@ -316,11 +316,11 @@ void ILSDemodSink::processOneAudioSample(Complex &ci) if (m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_audioBuffer.size())); if (res != m_audioBufferFill) { - qDebug("ILSDemodSink::processOneAudioSample: %u/%u audio samples written", res, m_audioBufferFill); + qDebug("ILSDemodSink::processOneAudioSample: %lu/%lu audio samples written", res, m_audioBufferFill); m_audioFifo.clear(); } diff --git a/plugins/channelrx/demodils/ilsdemodsink.h b/plugins/channelrx/demodils/ilsdemodsink.h index 4b4e5973c..8de95abe1 100644 --- a/plugins/channelrx/demodils/ilsdemodsink.h +++ b/plugins/channelrx/demodils/ilsdemodsink.h @@ -149,7 +149,7 @@ private: Real m_audioInterpolatorDistanceRemain; AudioVector m_audioBuffer; AudioFifo m_audioFifo; - uint32_t m_audioBufferFill; + std::size_t m_audioBufferFill; SampleVector m_sampleBuffer; static const int m_sampleBufferSize = ILSDemodSettings::ILSDEMOD_CHANNEL_SAMPLE_RATE / 20; diff --git a/plugins/channelrx/demodm17/m17demodprocessor.cpp b/plugins/channelrx/demodm17/m17demodprocessor.cpp index 8637ca4e5..8e3831641 100644 --- a/plugins/channelrx/demodm17/m17demodprocessor.cpp +++ b/plugins/channelrx/demodm17/m17demodprocessor.cpp @@ -520,10 +520,10 @@ void M17DemodProcessor::processAudio(const std::array& in) if (m_audioBufferFill >= m_audioBuffer.size() - 960) { - uint res = m_audioFifo->write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std::size_t res = m_audioFifo->write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_audioBuffer.size())); if (res != m_audioBufferFill) { - qDebug("M17DemodProcessor::processAudio: %u/%u audio samples written", res, m_audioBufferFill); + qDebug("M17DemodProcessor::processAudio: %lu/%lu audio samples written", res, m_audioBufferFill); } m_audioBufferFill = 0; diff --git a/plugins/channelrx/demodm17/m17demodprocessor.h b/plugins/channelrx/demodm17/m17demodprocessor.h index 2fa0b6e65..a7006a343 100644 --- a/plugins/channelrx/demodm17/m17demodprocessor.h +++ b/plugins/channelrx/demodm17/m17demodprocessor.h @@ -117,7 +117,7 @@ private: AudioFifo *m_audioFifo; bool m_audioMute; AudioVector m_audioBuffer; - uint m_audioBufferFill; + std::size_t m_audioBufferFill; float m_volume; int m_upsampling; //!< upsampling factor float m_upsamplingFactors[7]; diff --git a/plugins/channelrx/demodm17/m17demodsink.cpp b/plugins/channelrx/demodm17/m17demodsink.cpp index 88aa0dbfd..8031f563f 100644 --- a/plugins/channelrx/demodm17/m17demodsink.cpp +++ b/plugins/channelrx/demodm17/m17demodsink.cpp @@ -60,7 +60,6 @@ M17DemodSink::M17DemodSink() : m_scopeEnabled(true) { m_audioBuffer.resize(1<<14); - m_audioBufferFill = 0; m_demodBuffer.resize(1<<12); m_demodBufferFill = 0; m_m17DemodProcessor.setAudioFifo(&m_audioFifo); diff --git a/plugins/channelrx/demodm17/m17demodsink.h b/plugins/channelrx/demodm17/m17demodsink.h index bd0bc5081..11a024e10 100644 --- a/plugins/channelrx/demodm17/m17demodsink.h +++ b/plugins/channelrx/demodm17/m17demodsink.h @@ -167,7 +167,6 @@ private: SampleVector m_scopeSampleBuffer; AudioVector m_audioBuffer; - uint m_audioBufferFill; FixReal *m_sampleBuffer; //!< samples ring buffer int m_sampleBufferIndex; int m_scaleFromShort; diff --git a/plugins/channelrx/demodnfm/nfmdemodsink.cpp b/plugins/channelrx/demodnfm/nfmdemodsink.cpp index 9bbd55ec4..643f29e7a 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsink.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodsink.cpp @@ -244,11 +244,11 @@ void NFMDemodSink::processOneSample(Complex &ci) if (m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_audioBuffer.size())); if (res != m_audioBufferFill) { - qDebug("NFMDemodSink::processOneSample: %u/%u audio samples written m_audioSampleRate: %u m_channelSampleRate: %d", + qDebug("NFMDemodSink::processOneSample: %lu/%lu audio samples written m_audioSampleRate: %u m_channelSampleRate: %d", res, m_audioBufferFill, m_audioSampleRate, m_channelSampleRate); } diff --git a/plugins/channelrx/demodnfm/nfmdemodsink.h b/plugins/channelrx/demodnfm/nfmdemodsink.h index fd175bc5f..fd4b4d7e0 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsink.h +++ b/plugins/channelrx/demodnfm/nfmdemodsink.h @@ -103,7 +103,7 @@ private: int m_audioSampleRate; AudioVector m_audioBuffer; - uint m_audioBufferFill; + std::size_t m_audioBufferFill; AudioFifo m_audioFifo; QVector m_demodBuffer; int m_demodBufferFill; diff --git a/plugins/channelrx/demodssb/ssbdemodsink.cpp b/plugins/channelrx/demodssb/ssbdemodsink.cpp index 389328cba..d35b23d24 100644 --- a/plugins/channelrx/demodssb/ssbdemodsink.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsink.cpp @@ -241,10 +241,10 @@ void SSBDemodSink::processOneSample(Complex &ci) if (m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_audioBuffer.size())); if (res != m_audioBufferFill) { - qDebug("SSBDemodSink::processOneSample: %u/%u samples written", res, m_audioBufferFill); + qDebug("SSBDemodSink::processOneSample: %lu/%lu samples written", res, m_audioBufferFill); } m_audioBufferFill = 0; diff --git a/plugins/channelrx/demodssb/ssbdemodsink.h b/plugins/channelrx/demodssb/ssbdemodsink.h index f8376a66a..67d3ba47b 100644 --- a/plugins/channelrx/demodssb/ssbdemodsink.h +++ b/plugins/channelrx/demodssb/ssbdemodsink.h @@ -121,7 +121,7 @@ private: SampleVector m_sampleBuffer; AudioVector m_audioBuffer; - uint m_audioBufferFill; + std::size_t m_audioBufferFill; AudioFifo m_audioFifo; quint32 m_audioSampleRate; diff --git a/plugins/channelrx/demodvor/vordemodsink.cpp b/plugins/channelrx/demodvor/vordemodsink.cpp index 18b9e2153..9f54a627f 100644 --- a/plugins/channelrx/demodvor/vordemodsink.cpp +++ b/plugins/channelrx/demodvor/vordemodsink.cpp @@ -149,11 +149,11 @@ void VORDemodSCSink::processOneAudioSample(Complex &ci) if (m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_audioBuffer.size())); if (res != m_audioBufferFill) { - qDebug("VORDemodSCSink::processOneAudioSample: %u/%u audio samples written", res, m_audioBufferFill); + qDebug("VORDemodSCSink::processOneAudioSample: %lu/%lu audio samples written", res, m_audioBufferFill); m_audioFifo.clear(); } diff --git a/plugins/channelrx/demodvor/vordemodsink.h b/plugins/channelrx/demodvor/vordemodsink.h index 782c87fe2..f0cc047ec 100644 --- a/plugins/channelrx/demodvor/vordemodsink.h +++ b/plugins/channelrx/demodvor/vordemodsink.h @@ -115,7 +115,7 @@ private: Real m_audioInterpolatorDistanceRemain; AudioVector m_audioBuffer; AudioFifo m_audioFifo; - uint32_t m_audioBufferFill; + std::size_t m_audioBufferFill; NCO m_ncoRef; Lowpass m_lowpassRef; diff --git a/plugins/channelrx/demodwfm/wfmdemodsink.cpp b/plugins/channelrx/demodwfm/wfmdemodsink.cpp index 2a71f8158..0540d3d93 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsink.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodsink.cpp @@ -126,10 +126,10 @@ void WFMDemodSink::feed(const SampleVector::const_iterator& begin, const SampleV if(m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_audioBuffer.size())); if (res != m_audioBufferFill) { - qDebug("WFMDemodSink::feed: %u/%u audio samples written", res, m_audioBufferFill); + qDebug("WFMDemodSink::feed: %lu/%lu audio samples written", res, m_audioBufferFill); } m_audioBufferFill = 0; diff --git a/plugins/channelrx/demodwfm/wfmdemodsink.h b/plugins/channelrx/demodwfm/wfmdemodsink.h index fa569979c..bf1ac7b65 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsink.h +++ b/plugins/channelrx/demodwfm/wfmdemodsink.h @@ -114,7 +114,7 @@ private: Real m_fmExcursion; AudioVector m_audioBuffer; - uint m_audioBufferFill; + std::size_t m_audioBufferFill; AudioFifo m_audioFifo; PhaseDiscriminators m_phaseDiscri; diff --git a/plugins/channelrx/udpsink/udpsinksink.cpp b/plugins/channelrx/udpsink/udpsinksink.cpp index d8f3eea5f..c38056bc4 100644 --- a/plugins/channelrx/udpsink/udpsinksink.cpp +++ b/plugins/channelrx/udpsink/udpsinksink.cpp @@ -314,10 +314,10 @@ void UDPSinkSink::audioReadyRead() if (m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], std::min(m_audioBufferFill, m_sampleBuffer.size())); if (res != m_audioBufferFill) { - qDebug("UDPSinkSink::audioReadyRead: (stereo) lost %u samples", m_audioBufferFill - res); + qDebug("WFMDemodSink::feed: %lu/%lu audio samples written", res, m_audioBufferFill); } m_audioBufferFill = 0; diff --git a/plugins/channelrx/udpsink/udpsinksink.h b/plugins/channelrx/udpsink/udpsinksink.h index cab2c01ea..082ac35ce 100644 --- a/plugins/channelrx/udpsink/udpsinksink.h +++ b/plugins/channelrx/udpsink/udpsinksink.h @@ -104,7 +104,7 @@ private: UDPSinkUtil *m_udpBuffer24; AudioVector m_audioBuffer; - uint m_audioBufferFill; + std::size_t m_audioBufferFill; AudioFifo m_audioFifo; BasebandSampleSink* m_spectrum;