X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fsiff.c;h=60a867df141954f56490c7019bb3dff1b8ebb6b8;hb=240aa70b798e99c15191d986261966bdbce59dba;hp=ddd171568061c59e99a3354e87c62dbb42f28ca6;hpb=26148e923613e718787c6fc4bf3f64e8909f597c;p=ffmpeg diff --git a/libavformat/siff.c b/libavformat/siff.c index ddd17156806..60a867df141 100644 --- a/libavformat/siff.c +++ b/libavformat/siff.c @@ -62,7 +62,7 @@ typedef struct SIFFContext { uint8_t gmc[4]; } SIFFContext; -static int siff_probe(AVProbeData *p) +static int siff_probe(const AVProbeData *p) { uint32_t tag = AV_RL32(p->buf + 8); /* check file header */ @@ -192,6 +192,7 @@ static int siff_read_header(AVFormatContext *s) static int siff_read_packet(AVFormatContext *s, AVPacket *pkt) { SIFFContext *c = s->priv_data; + int ret; if (c->has_video) { unsigned int size; @@ -200,6 +201,8 @@ static int siff_read_packet(AVFormatContext *s, AVPacket *pkt) if (c->curstrm == -1) { c->pktsize = avio_rl32(s->pb) - 4; c->flags = avio_rl16(s->pb); + if (c->flags & VB_HAS_AUDIO && !c->has_audio) + return AVERROR_INVALIDDATA; c->gmcsize = (c->flags & VB_HAS_GMC) ? 4 : 0; if (c->gmcsize) avio_read(s->pb, c->gmc, c->gmcsize); @@ -213,13 +216,12 @@ static int siff_read_packet(AVFormatContext *s, AVPacket *pkt) size = c->pktsize - c->sndsize - c->gmcsize - 2; size = ffio_limit(s->pb, size); - if (av_new_packet(pkt, size + c->gmcsize + 2) < 0) - return AVERROR(ENOMEM); + if ((ret = av_new_packet(pkt, size + c->gmcsize + 2)) < 0) + return ret; AV_WL16(pkt->data, c->flags); if (c->gmcsize) memcpy(pkt->data + 2, c->gmc, c->gmcsize); if (avio_read(s->pb, pkt->data + 2 + c->gmcsize, size) != size) { - av_packet_unref(pkt); return AVERROR_INVALIDDATA; } pkt->stream_index = 0;