[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