diff options
author | Przemysław Sobala <przemyslaw.sobala@grupawp.pl> | 2015-09-29 15:25:07 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2015-09-29 19:21:13 +0200 |
commit | 01dd7e025c246d9001f1a30f4a5d8fa2936d1a5e (patch) | |
tree | 2095c0b7e3b6520af988377e16fa52d85a18d637 /libavformat/img2dec.c | |
parent | ed18c49f5ff8a124a805142fb9a1803890563822 (diff) | |
download | ffmpeg-01dd7e025c246d9001f1a30f4a5d8fa2936d1a5e.tar.gz |
lavf/img2dec: Fix memory leak
Fixes #4886
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat/img2dec.c')
-rw-r--r-- | libavformat/img2dec.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c index 70f0b09f18..16975792ee 100644 --- a/libavformat/img2dec.c +++ b/libavformat/img2dec.c @@ -444,14 +444,17 @@ int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt) } res = av_new_packet(pkt, size[0] + size[1] + size[2]); - if (res < 0) - return res; + if (res < 0) { + goto fail; + } pkt->stream_index = 0; pkt->flags |= AV_PKT_FLAG_KEY; if (s->ts_from_file) { struct stat img_stat; - if (stat(filename, &img_stat)) - return AVERROR(EIO); + if (stat(filename, &img_stat)) { + res = AVERROR(EIO); + goto fail; + } pkt->pts = (int64_t)img_stat.st_mtime; #if HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC if (s->ts_from_file == 2) @@ -485,18 +488,29 @@ int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt) if (ret[0] <= 0 || ret[1] < 0 || ret[2] < 0) { av_free_packet(pkt); if (ret[0] < 0) { - return ret[0]; + res = ret[0]; } else if (ret[1] < 0) { - return ret[1]; - } else if (ret[2] < 0) - return ret[2]; - return AVERROR_EOF; + res = ret[1]; + } else if (ret[2] < 0) { + res = ret[2]; + } else { + res = AVERROR_EOF; + } + goto fail; } else { s->img_count++; s->img_number++; s->pts++; return 0; } + +fail: + if (!s->is_pipe) { + for (i = 0; i < 3; i++) { + avio_closep(&f[i]); + } + } + return res; } static int img_read_close(struct AVFormatContext* s1) |