From 6aa19e95527537f5032d0b19d93abc6034df3a9e Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Tue, 15 Sep 2026 21:45:40 +0300
Subject: [PATCH] update dr_mp3 from mainstream (Sep. 01, 2026)
---
src/dr_mp3.h | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/src/dr_mp3.h b/src/dr_mp3.h
index 9243b4c2a..e7c58e931 100644
--- a/src/dr_mp3.h
+++ b/src/dr_mp3.h
@@ -3218,9 +3218,9 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm
pDataBufferEnd = pMP3->pData + pMP3->dataCapacity;
}
- frameBytes = DRMP3_MIN((size_t)firstFrameInfo.frame_bytes, (size_t)((drmp3_uint8*)pDataBufferEnd - pTagDataBeg));
+ frameBytes = DRMP3_MIN((size_t)firstFrameInfo.frame_bytes, (size_t)((drmp3_uint8*)pDataBufferEnd - pFirstFrameData));
- if (frameBytes - (size_t)(pTagData - pFirstFrameData) < 8) {
+ if (frameBytes < (size_t)(pTagData - pFirstFrameData) + 8) {
goto done_xing_info; /* Frame too small for a Xing/Info tag. */
}
@@ -3235,7 +3235,7 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm
pTagData += 8; /* Skip past the ID and flags. */
if (flags & 0x01) { /* FRAMES flag. */
- if (frameBytes - (size_t)(pTagData - pFirstFrameData) < 4) {
+ if (frameBytes < (size_t)(pTagData - pFirstFrameData) + 4) {
goto done_xing_info; /* Invalid Xing/Info tag. */
}
@@ -3244,7 +3244,7 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm
}
if (flags & 0x02) { /* BYTES flag. */
- if (frameBytes - (size_t)(pTagData - pFirstFrameData) < 4) {
+ if (frameBytes < (size_t)(pTagData - pFirstFrameData) + 4) {
goto done_xing_info; /* Invalid Xing/Info tag. */
}
@@ -3254,7 +3254,7 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm
}
if (flags & 0x04) { /* TOC flag. */
- if (frameBytes - (size_t)(pTagData - pFirstFrameData) < 100) {
+ if (frameBytes < (size_t)(pTagData - pFirstFrameData) + 100) {
goto done_xing_info; /* Invalid Xing/Info tag. */
}
@@ -3263,19 +3263,23 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm
}
if (flags & 0x08) { /* SCALE flag. */
- if (frameBytes - (size_t)(pTagData - pFirstFrameData) < 4) {
+ if (frameBytes < (size_t)(pTagData - pFirstFrameData) + 4) {
goto done_xing_info; /* Invalid Xing/Info tag. */
}
-
+
pTagData += 4;
}
/* At this point we're done with the Xing/Info header. Now we can look at the LAME data. */
+ if (frameBytes < (size_t)(pTagData - pFirstFrameData) + 1) {
+ goto done_xing_info; /* Not enough data left to check for a LAME header. */
+ }
+
if (pTagData[0]) {
int delayInPCMFrames;
int paddingInPCMFrames;
- if (frameBytes - (size_t)(pTagData - pFirstFrameData) < 36) {
+ if (frameBytes < (size_t)(pTagData - pFirstFrameData) + 36) {
goto done_xing_info; /* Invalid Xing/Info tag. */
}