1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-26 19:01:44 +02:00

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>
This commit is contained in:
Andreas Rheinhardt 2020-07-20 02:46:09 +02:00
parent 84655b7101
commit 49e78548c3

View File

@ -822,15 +822,17 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size
return 0; 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; MXFMetadataSet **tmp;
tmp = av_realloc_array(mxf->metadata_sets, mxf->metadata_sets_count + 1, sizeof(*mxf->metadata_sets)); 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); return AVERROR(ENOMEM);
}
mxf->metadata_sets = tmp; 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++; mxf->metadata_sets_count++;
return 0; return 0;
} }
@ -2780,7 +2782,7 @@ static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadF
avio_seek(pb, next, SEEK_SET); avio_seek(pb, next, SEEK_SET);
} }
if (ctx_size) ctx->type = type; 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)))) if (!(segment = av_mallocz(sizeof(*segment))))
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
if ((ret = mxf_add_metadata_set(mxf, segment))) { if ((ret = mxf_add_metadata_set(mxf, (MXFMetadataSet**)&segment)))
mxf_free_metadataset((MXFMetadataSet**)&segment, 1);
return ret; return ret;
}
/* Make sure we have nonzero unique index_sid, body_sid will be ok, because /* Make sure we have nonzero unique index_sid, body_sid will be ok, because
* using the same SID for index is forbidden in MXF. */ * using the same SID for index is forbidden in MXF. */