aboutsummaryrefslogtreecommitdiff
path: root/libavformat/img2dec.c
diff options
context:
space:
mode:
authorPrzemysław Sobala2015-09-29 15:25:07 +0200
committerMichael Niedermayer2015-09-29 19:21:13 +0200
commit01dd7e025c246d9001f1a30f4a5d8fa2936d1a5e (patch)
tree2095c0b7e3b6520af988377e16fa52d85a18d637 /libavformat/img2dec.c
parented18c49f5ff8a124a805142fb9a1803890563822 (diff)
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.c32
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)