Do not read from after the table, fixes CID108 RUN2.
[libav.git] / libavformat / tiertexseq.c
index 4bd1cda..bcce674 100644 (file)
@@ -62,7 +62,7 @@ static int seq_probe(AVProbeData *p)
 {
     int i;
 
-    if (p->buf_size < 256)
+    if (p->buf_size < 258)
         return 0;
 
     /* there's no real header in a .seq file, the only thing they have in common */
@@ -71,6 +71,9 @@ static int seq_probe(AVProbeData *p)
         if (p->buf[i] != 0)
             return 0;
 
+    if(p->buf[256]==0 && p->buf[257]==0)
+        return 0;
+
     /* only one fourth of the score since the previous check is too naive */
     return AVPROBE_SCORE_MAX / 4;
 }
@@ -92,7 +95,7 @@ static int seq_init_frame_buffers(SeqDemuxContext *seq, ByteIOContext *pb)
             seq_buffer->data_size = sz;
             seq_buffer->data = av_malloc(sz);
             if (!seq_buffer->data)
-                return AVERROR_NOMEM;
+                return AVERROR(ENOMEM);
         }
     }
     seq->frame_buffers_count = i;
@@ -112,7 +115,7 @@ static int seq_fill_buffer(SeqDemuxContext *seq, ByteIOContext *pb, int buffer_n
 
     url_fseek(pb, seq->current_frame_offs + data_offs, SEEK_SET);
     if (get_buffer(pb, seq_buffer->data + seq_buffer->fill_size, data_size) != data_size)
-        return AVERROR_IO;
+        return AVERROR(EIO);
 
     seq_buffer->fill_size += data_size;
     return 0;
@@ -122,7 +125,7 @@ static int seq_parse_frame_data(SeqDemuxContext *seq, ByteIOContext *pb)
 {
     unsigned int offset_table[4], buffer_num[4];
     TiertexSeqFrameBuffer *seq_buffer;
-    int i, e;
+    int i, e, err;
 
     seq->current_frame_offs += SEQ_FRAME_SIZE;
     url_fseek(pb, seq->current_frame_offs, SEEK_SET);
@@ -152,14 +155,19 @@ static int seq_parse_frame_data(SeqDemuxContext *seq, ByteIOContext *pb)
 
     for (i = 0; i < 3; i++) {
         if (offset_table[i] != 0) {
-            for (e = i + 1; e < 4 && offset_table[e] == 0; e++);
-            seq_fill_buffer(seq, pb, buffer_num[1 + i],
+            for (e = i + 1; e < 3 && offset_table[e] == 0; e++);
+            err = seq_fill_buffer(seq, pb, buffer_num[1 + i],
               offset_table[i],
               offset_table[e] - offset_table[i]);
+            if (err != 0)
+                return err;
         }
     }
 
     if (buffer_num[0] != 255) {
+        if (buffer_num[0] >= SEQ_NUM_FRAME_BUFFERS)
+            return AVERROR_INVALIDDATA;
+
         seq_buffer = &seq->frame_buffers[buffer_num[0]];
         seq->current_video_data_size = seq_buffer->fill_size;
         seq->current_video_data_ptr  = seq_buffer->data;
@@ -175,8 +183,8 @@ static int seq_parse_frame_data(SeqDemuxContext *seq, ByteIOContext *pb)
 static int seq_read_header(AVFormatContext *s, AVFormatParameters *ap)
 {
     int i, rc;
-    SeqDemuxContext *seq = (SeqDemuxContext *)s->priv_data;
-    ByteIOContext *pb = &s->pb;
+    SeqDemuxContext *seq = s->priv_data;
+    ByteIOContext *pb = s->pb;
     AVStream *st;
 
     /* init internal buffers */
@@ -200,7 +208,7 @@ static int seq_read_header(AVFormatContext *s, AVFormatParameters *ap)
     /* initialize the video decoder stream */
     st = av_new_stream(s, 0);
     if (!st)
-        return AVERROR_NOMEM;
+        return AVERROR(ENOMEM);
 
     av_set_pts_info(st, 32, 1, SEQ_FRAME_RATE);
     seq->video_stream_index = st->index;
@@ -213,7 +221,7 @@ static int seq_read_header(AVFormatContext *s, AVFormatParameters *ap)
     /* initialize the audio decoder stream */
     st = av_new_stream(s, 0);
     if (!st)
-        return AVERROR_NOMEM;
+        return AVERROR(ENOMEM);
 
     av_set_pts_info(st, 32, 1, SEQ_SAMPLE_RATE);
     seq->audio_stream_index = st->index;
@@ -232,8 +240,8 @@ static int seq_read_header(AVFormatContext *s, AVFormatParameters *ap)
 static int seq_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     int rc;
-    SeqDemuxContext *seq = (SeqDemuxContext *)s->priv_data;
-    ByteIOContext *pb = &s->pb;
+    SeqDemuxContext *seq = s->priv_data;
+    ByteIOContext *pb = s->pb;
 
     if (!seq->audio_buffer_full) {
         rc = seq_parse_frame_data(seq, pb);
@@ -243,14 +251,14 @@ static int seq_read_packet(AVFormatContext *s, AVPacket *pkt)
         /* video packet */
         if (seq->current_pal_data_size + seq->current_video_data_size != 0) {
             if (av_new_packet(pkt, 1 + seq->current_pal_data_size + seq->current_video_data_size))
-                return AVERROR_NOMEM;
+                return AVERROR(ENOMEM);
 
             pkt->data[0] = 0;
             if (seq->current_pal_data_size != 0) {
                 pkt->data[0] |= 1;
                 url_fseek(pb, seq->current_frame_offs + seq->current_pal_data_offs, SEEK_SET);
                 if (get_buffer(pb, &pkt->data[1], seq->current_pal_data_size) != seq->current_pal_data_size)
-                    return AVERROR_IO;
+                    return AVERROR(EIO);
             }
             if (seq->current_video_data_size != 0) {
                 pkt->data[0] |= 2;
@@ -269,7 +277,7 @@ static int seq_read_packet(AVFormatContext *s, AVPacket *pkt)
 
     /* audio packet */
     if (seq->current_audio_data_offs == 0) /* end of data reached */
-        return AVERROR_IO;
+        return AVERROR(EIO);
 
     url_fseek(pb, seq->current_frame_offs + seq->current_audio_data_offs, SEEK_SET);
     rc = av_get_packet(pb, pkt, seq->current_audio_data_size);
@@ -286,7 +294,7 @@ static int seq_read_packet(AVFormatContext *s, AVPacket *pkt)
 static int seq_read_close(AVFormatContext *s)
 {
     int i;
-    SeqDemuxContext *seq = (SeqDemuxContext *)s->priv_data;
+    SeqDemuxContext *seq = s->priv_data;
 
     for (i = 0; i < SEQ_NUM_FRAME_BUFFERS; i++)
         av_free(seq->frame_buffers[i].data);