[FFmpeg-devel] [PATCH] [matroska] Check return value of avio_seek and avoid modifying state if it fails

Joakim Plate elupus at ecce.se
Wed Sep 14 20:12:06 CEST 2011


---
 libavformat/matroskadec.c |   24 ++++++++++++++----------
 1 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 3a5940b..7564c2d 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2018,25 +2018,20 @@ static int matroska_read_seek(AVFormatContext
*s, int stream_index,
     timestamp = FFMAX(timestamp, st->index_entries[0].timestamp);

     if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) {
-        avio_seek(s->pb,
st->index_entries[st->nb_index_entries-1].pos, SEEK_SET);
+        if (avio_seek(s->pb,
st->index_entries[st->nb_index_entries-1].pos, SEEK_SET) < 0)
+            return -1;
         matroska->current_id = 0;
         while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) {
             matroska_clear_queue(matroska);
             if (matroska_parse_cluster(matroska) < 0)
                 break;
         }
-    }
-
-    matroska_clear_queue(matroska);
-    if (index < 0)
+        matroska_clear_queue(matroska);
         return 0;
+    }

     index_min = index;
     for (i=0; i < matroska->tracks.nb_elem; i++) {
-        tracks[i].audio.pkt_cnt = 0;
-        tracks[i].audio.sub_packet_cnt = 0;
-        tracks[i].audio.buf_timecode = AV_NOPTS_VALUE;
-        tracks[i].end_timecode = 0;
         if (tracks[i].type == MATROSKA_TRACK_TYPE_SUBTITLE
             && !tracks[i].stream->discard != AVDISCARD_ALL) {
             index_sub = av_index_search_timestamp(tracks[i].stream,
st->index_entries[index].timestamp, AVSEEK_FLAG_BACKWARD);
@@ -2047,7 +2042,16 @@ static int matroska_read_seek(AVFormatContext
*s, int stream_index,
         }
     }

-    avio_seek(s->pb, st->index_entries[index_min].pos, SEEK_SET);
+    if (avio_seek(s->pb, st->index_entries[index_min].pos, SEEK_SET) < 0)
+        return -1;
+
+    matroska_clear_queue(matroska);
+    for (i=0; i < matroska->tracks.nb_elem; i++) {
+        tracks[i].audio.pkt_cnt = 0;
+        tracks[i].audio.sub_packet_cnt = 0;
+        tracks[i].audio.buf_timecode = AV_NOPTS_VALUE;
+        tracks[i].end_timecode = 0;
+    }
     matroska->current_id = 0;
     matroska->skip_to_keyframe = !(flags & AVSEEK_FLAG_ANY);
     matroska->skip_to_timecode = st->index_entries[index].timestamp;
-- 
1.7.6


More information about the ffmpeg-devel mailing list