From da1629328fba572a8f8986706fc0a818ea3d645c Mon Sep 17 00:00:00 2001 From: isaac <> Date: Tue, 21 Apr 2026 22:04:47 +0400 Subject: [PATCH] Fix resample --- .../FFMpegBinding/Sources/FFMpegSWResample.m | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/submodules/FFMpegBinding/Sources/FFMpegSWResample.m b/submodules/FFMpegBinding/Sources/FFMpegSWResample.m index c6771b6db3..a2391be99a 100644 --- a/submodules/FFMpegBinding/Sources/FFMpegSWResample.m +++ b/submodules/FFMpegBinding/Sources/FFMpegSWResample.m @@ -111,22 +111,37 @@ return nil; } + int64_t outSamples = (int64_t)frameImpl->nb_samples * (int64_t)_ratio; + // Cap at 8M samples per frame: ~10× larger than any legitimate codec + // frame × resample ratio, bounds the per-frame buffer to ~32 MB (s16 stereo), + // and rejects pathological inputs (e.g. 1 Hz source with a 65 KB FLAC block). + if (outSamples <= 0 || outSamples > 8 * 1024 * 1024) { + return nil; + } + int bufSize = av_samples_get_buffer_size(NULL, (int)_destinationChannelCount, - frameImpl->nb_samples * (int)_ratio, + (int)outSamples, (enum AVSampleFormat)_destinationSampleFormat, 1); - - if (!_buffer || _bufferSize < bufSize) { - _bufferSize = bufSize; - _buffer = realloc(_buffer, _bufferSize); + if (bufSize <= 0) { + return nil; } - + + if (!_buffer || _bufferSize < bufSize) { + void *newBuffer = realloc(_buffer, bufSize); + if (!newBuffer) { + return nil; + } + _buffer = newBuffer; + _bufferSize = bufSize; + } + Byte *outbuf[2] = { _buffer, 0 }; - + int numFrames = swr_convert(_context, outbuf, - frameImpl->nb_samples * (int)_ratio, + (int)outSamples, (const uint8_t **)frameImpl->data, frameImpl->nb_samples); if (numFrames <= 0) {