X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fcafdec.c;h=7fd9c6b8d13aa038079d2adb710afbfd34fbb855;hb=2d9d4440519f22c092ac37ccd1a1a914564d00b5;hp=a576dac07e3ef0069b6f7e513c35b504b59e4372;hpb=0e097616865ea8a1fa8e63a451a4921336660283;p=ffmpeg diff --git a/libavformat/cafdec.c b/libavformat/cafdec.c index a576dac07e3..7fd9c6b8d13 100644 --- a/libavformat/cafdec.c +++ b/libavformat/cafdec.c @@ -225,7 +225,7 @@ static int read_header(AVFormatContext *s) AVStream *st; uint32_t tag = 0; int found_data, ret; - int64_t size; + int64_t size, pos; avio_skip(pb, 8); /* magic, version, file flags */ @@ -254,6 +254,7 @@ static int read_header(AVFormatContext *s) tag = avio_rb32(pb); size = avio_rb64(pb); + pos = avio_tell(pb); if (url_feof(pb)) break; @@ -296,9 +297,14 @@ static int read_header(AVFormatContext *s) case MKBETAG('f','r','e','e'): if (size < 0) return AVERROR_INVALIDDATA; - avio_skip(pb, size); break; } + + if (size > 0) { + if (pos + size < pos) + return AVERROR_INVALIDDATA; + avio_skip(pb, FFMAX(0, pos + size - avio_tell(pb))); + } } if (!found_data) @@ -337,12 +343,14 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) int64_t left = CAF_MAX_PKT_SIZE; if (url_feof(pb)) - return AVERROR(EIO); + return AVERROR_EOF; /* don't read past end of data chunk */ if (caf->data_size > 0) { left = (caf->data_start + caf->data_size) - avio_tell(pb); - if (left <= 0) + if (!left) + return AVERROR_EOF; + if (left < 0) return AVERROR(EIO); } @@ -393,7 +401,7 @@ static int read_seek(AVFormatContext *s, int stream_index, if (caf->frames_per_packet > 0 && caf->bytes_per_packet > 0) { /* calculate new byte position based on target frame position */ - pos = caf->bytes_per_packet * timestamp / caf->frames_per_packet; + pos = caf->bytes_per_packet * (timestamp / caf->frames_per_packet); if (caf->data_size > 0) pos = FFMIN(pos, caf->data_size); packet_cnt = pos / caf->bytes_per_packet;