aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-07-20 02:46:09 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-07-24 03:21:37 +0200
commit49e78548c35be84200ea9f617c4b5b2f58c7e6f6 (patch)
treea620722c4538b392d917a3087248f91fd2b5cd34
parent84655b7101a02230db1b34c7f77bd5464c9501cd (diff)
downloadffmpeg-49e78548c35be84200ea9f617c4b5b2f58c7e6f6.tar.gz
avformat/mxfdec: Fix memleak when adding element to array fails
Said array contains pointers to other structs and both the designated new element as well as other stuff contained in it (e.g. strings) leak if the new element can't be added to the array. Reviewed-by: Tomas Härdin <tjoppen@acc.umu.se> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r--libavformat/mxfdec.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index 90546d42b3..08ad92cc0c 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -822,15 +822,17 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size
return 0;
}
-static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
+static int mxf_add_metadata_set(MXFContext *mxf, MXFMetadataSet **metadata_set)
{
MXFMetadataSet **tmp;
tmp = av_realloc_array(mxf->metadata_sets, mxf->metadata_sets_count + 1, sizeof(*mxf->metadata_sets));
- if (!tmp)
+ if (!tmp) {
+ mxf_free_metadataset(metadata_set, 1);
return AVERROR(ENOMEM);
+ }
mxf->metadata_sets = tmp;
- mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;
+ mxf->metadata_sets[mxf->metadata_sets_count] = *metadata_set;
mxf->metadata_sets_count++;
return 0;
}
@@ -2780,7 +2782,7 @@ static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadF
avio_seek(pb, next, SEEK_SET);
}
if (ctx_size) ctx->type = type;
- return ctx_size ? mxf_add_metadata_set(mxf, ctx) : 0;
+ return ctx_size ? mxf_add_metadata_set(mxf, &ctx) : 0;
}
/**
@@ -3083,10 +3085,8 @@ static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st)
if (!(segment = av_mallocz(sizeof(*segment))))
return AVERROR(ENOMEM);
- if ((ret = mxf_add_metadata_set(mxf, segment))) {
- mxf_free_metadataset((MXFMetadataSet**)&segment, 1);
+ if ((ret = mxf_add_metadata_set(mxf, (MXFMetadataSet**)&segment)))
return ret;
- }
/* Make sure we have nonzero unique index_sid, body_sid will be ok, because
* using the same SID for index is forbidden in MXF. */