sdl12-compat: update dr_mp3 from mainstream (Sep. 01, 2026)

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. */
                         }