changeset 34826:26d77af0f13a

Add some additional checks to ensure subtractions do not overflow. Patch by Benot Thbaudeau [benoit thebaudeau advansee com].
author reimar
date Fri, 18 May 2012 17:01:13 +0000
parents 5ed9693f8071
children ef7be22beabe
files libmpdemux/demux_audio.c
diffstat 1 files changed, 7 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_audio.c	Thu May 17 22:10:19 2012 +0000
+++ b/libmpdemux/demux_audio.c	Fri May 18 17:01:13 2012 +0000
@@ -440,13 +440,14 @@
     duration = (double) mp3_vbr_frames(s, demuxer->movi_start) * mp3_found->mpa_spf / mp3_found->mp3_freq;
     free(mp3_found);
     mp3_found = NULL;
-    if(s->end_pos && (s->flags & MP_STREAM_SEEK) == MP_STREAM_SEEK) {
-      stream_seek(s,s->end_pos-128);
+    if(demuxer->movi_end && (s->flags & MP_STREAM_SEEK) == MP_STREAM_SEEK) {
+      if(demuxer->movi_end >= 128) {
+        stream_seek(s,demuxer->movi_end-128);
       stream_read(s,hdr,3);
       if(!memcmp(hdr,"TAG",3)) {
 	char buf[31];
 	uint8_t g;
-	demuxer->movi_end = stream_tell(s)-3;
+          demuxer->movi_end -= 128;
 	stream_read(s,buf,30);
 	buf[30] = '\0';
 	demux_info_add(demuxer,"Title",buf);
@@ -470,6 +471,8 @@
 	g = stream_read_char(s);
 	demux_info_add(demuxer,"Genre",genres[g]);
       }
+      }
+      if(demuxer->movi_end >= 10) {
       stream_seek(s,demuxer->movi_end-10);
       stream_read(s,hdr,4);
       if(!memcmp(hdr,"3DI",3) && hdr[3] >= 4 && hdr[3] != 0xff) {
@@ -490,6 +493,7 @@
         }
       }
     }
+    }
     if (duration && demuxer->movi_end && demuxer->movi_end > demuxer->movi_start) sh_audio->wf->nAvgBytesPerSec = (demuxer->movi_end - demuxer->movi_start) / duration;
     sh_audio->i_bps = sh_audio->wf->nAvgBytesPerSec;
     break;