]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/avidec.c
Add my name to copyright & author as requested by the original author.
[ffmpeg] / libavformat / avidec.c
index 2216b3558247c9e7ed2efa7c3742b45000eb2d1d..78e5051e1e12cb3aabc17cce2e3e55119366071e 100644 (file)
@@ -165,6 +165,9 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
 #ifdef DEBUG_SEEK
             av_log(s, AV_LOG_ERROR, "pos:%"PRId64", len:%X\n", pos, len);
 #endif
+            if(url_feof(pb))
+                return -1;
+
             if(last_pos == pos || pos == base - 8)
                 avi->non_interleaved= 1;
             if(last_pos != pos)
@@ -181,6 +184,10 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
             offset = get_le64(pb);
             get_le32(pb);       /* size */
             duration = get_le32(pb);
+
+            if(url_feof(pb))
+                return -1;
+
             pos = url_ftell(pb);
 
             url_fseek(pb, offset+8, SEEK_SET);
@@ -643,12 +650,13 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     AVIContext *avi = s->priv_data;
     ByteIOContext *pb = s->pb;
-    int n, d[8], size;
+    int n, d[8];
+    unsigned int size;
     int64_t i, sync;
     void* dstr;
 
     if (CONFIG_DV_DEMUXER && avi->dv_demux) {
-        size = dv_get_packet(avi->dv_demux, pkt);
+        int size = dv_get_packet(avi->dv_demux, pkt);
         if (size >= 0)
             return size;
     }
@@ -710,7 +718,7 @@ resync:
     if(avi->stream_index >= 0){
         AVStream *st= s->streams[ avi->stream_index ];
         AVIStream *ast= st->priv_data;
-        int size;
+        int size, err;
 
         if(ast->sample_size <= 1) // minorityreport.AVI block_align=1024 sample_size=1 IMA-ADPCM
             size= INT_MAX;
@@ -722,14 +730,19 @@ resync:
         if(size > ast->remaining)
             size= ast->remaining;
         avi->last_pkt_pos= url_ftell(pb);
-        av_get_packet(pb, pkt, size);
+        err= av_get_packet(pb, pkt, size);
+        if(err<0)
+            return err;
 
         if(ast->has_pal && pkt->data && pkt->size<(unsigned)INT_MAX/2){
+            void *ptr= av_realloc(pkt->data, pkt->size + 4*256 + FF_INPUT_BUFFER_PADDING_SIZE);
+            if(ptr){
             ast->has_pal=0;
             pkt->size += 4*256;
-            pkt->data = av_realloc(pkt->data, pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
-            if(pkt->data)
+            pkt->data= ptr;
                 memcpy(pkt->data + pkt->size - 4*256, ast->pal, 4*256);
+            }else
+                av_log(s, AV_LOG_ERROR, "Failed to append palette\n");
         }
 
         if (CONFIG_DV_DEMUXER && avi->dv_demux) {
@@ -788,7 +801,7 @@ resync:
 
         n= get_stream_idx(d+2);
 //av_log(s, AV_LOG_DEBUG, "%X %X %X %X %X %X %X %X %"PRId64" %d %d\n", d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], i, size, n);
-        if(i + size > avi->fsize || d[0]<0)
+        if(i + (uint64_t)size > avi->fsize || d[0]<0)
             continue;
 
         //parse ix##
@@ -922,6 +935,9 @@ static int avi_read_idx1(AVFormatContext *s, int size)
 #if defined(DEBUG_SEEK)
         av_log(s, AV_LOG_DEBUG, "%d cum_len=%"PRId64"\n", len, ast->cum_len);
 #endif
+        if(url_feof(pb))
+            return -1;
+
         if(last_pos == pos)
             avi->non_interleaved= 1;
         else