X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Ficodec.c;h=b47fa98f8007634915b709e161a04592b33a34bf;hb=c5324d92c5f206dcdc2cf93ae237eaa7c1ad0a40;hp=f33fa1195b9ca48b24c664d4cf962b3b91075dab;hpb=a024c3ce9a502849013a4aa2c0a6de0c9270261c;p=ffmpeg diff --git a/libavformat/icodec.c b/libavformat/icodec.c index f33fa1195b9..b47fa98f800 100644 --- a/libavformat/icodec.c +++ b/libavformat/icodec.c @@ -43,7 +43,7 @@ typedef struct { IcoImage * images; } IcoDemuxContext; -static int probe(AVProbeData *p) +static int probe(const AVProbeData *p) { unsigned i, frames, checked = 0; @@ -96,8 +96,10 @@ static int read_header(AVFormatContext *s) break; st = avformat_new_stream(s, NULL); - if (!st) + if (!st) { + av_freep(&ico->images); return AVERROR(ENOMEM); + } st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; st->codecpar->width = avio_r8(pb); @@ -111,6 +113,7 @@ static int read_header(AVFormatContext *s) ico->images[i].size = avio_rl32(pb); if (ico->images[i].size <= 0) { av_log(s, AV_LOG_ERROR, "Invalid image size %d\n", ico->images[i].size); + av_freep(&ico->images); return AVERROR_INVALIDDATA; } ico->images[i].offset = avio_rl32(pb); @@ -126,8 +129,10 @@ static int read_header(AVFormatContext *s) st->codecpar->height = 0; break; case 40: - if (ico->images[i].size < 40) + if (ico->images[i].size < 40) { + av_freep(&ico->images); return AVERROR_INVALIDDATA; + } st->codecpar->codec_id = AV_CODEC_ID_BMP; tmp = avio_rl32(pb); if (tmp) @@ -138,6 +143,7 @@ static int read_header(AVFormatContext *s) break; default: avpriv_request_sample(s, "codec %d", codec); + av_freep(&ico->images); return AVERROR_INVALIDDATA; } } @@ -179,7 +185,6 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) bytestream_put_le32(&buf, 0); if ((ret = avio_read(pb, buf, image->size)) != image->size) { - av_packet_unref(pkt); return ret < 0 ? ret : AVERROR_INVALIDDATA; }