From a2771c71aacaabbd005025682c836c5f79023410 Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Thu, 11 Jun 2026 09:04:53 -0400 Subject: [PATCH] fix(mp3): guard sub-frame tail in getAlignedSegmentSize to prevent over-read past availableBytes --- DeepDrftPublic/Interop/audio/Mp3FormatDecoder.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DeepDrftPublic/Interop/audio/Mp3FormatDecoder.ts b/DeepDrftPublic/Interop/audio/Mp3FormatDecoder.ts index eda1397..cfb484d 100644 --- a/DeepDrftPublic/Interop/audio/Mp3FormatDecoder.ts +++ b/DeepDrftPublic/Interop/audio/Mp3FormatDecoder.ts @@ -79,10 +79,14 @@ export class Mp3FormatDecoder implements IFormatDecoder { if (info.blockAlign > 0) { // CBR: align to complete MP3 frames so each segment is independently decodable. + // Guard: need at least one full frame; discard sub-frame tail rather than over-reading. + if (availableBytes < info.blockAlign) return 0; + const minFrames = Math.ceil(minSize / info.blockAlign); const availableFrames = Math.floor(availableBytes / info.blockAlign); if (!streamComplete && availableFrames < minFrames) return 0; const requestedFrames = Math.floor(Math.min(requestedSize, availableBytes) / info.blockAlign); + // Never exceed availableBytes (clamp via requestedFrames which is floor'd from availableBytes). return Math.max(streamComplete ? 1 : minFrames, requestedFrames) * info.blockAlign; }