From 18ff4d20201ae69fdeb2da2c90bdcbd33f7ac025 Mon Sep 17 00:00:00 2001 From: Janne Grunau Date: Tue, 9 Oct 2012 15:20:15 +0200 Subject: avconv: simplify memory allocation in copy_chapters Make just a single reallocation per call instead of one reallocation per copied chapters. This fixes possible memory leaks on realloc failures. Also correct the allocation since it needs multiples of sizeof(AVChapter*) and not sizeof(AVChapter). Fixes CID700633 and CID700719. --- avconv_opt.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'avconv_opt.c') diff --git a/avconv_opt.c b/avconv_opt.c index 108e510516..f8a76c0978 100644 --- a/avconv_opt.c +++ b/avconv_opt.c @@ -1085,8 +1085,14 @@ static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata) { AVFormatContext *is = ifile->ctx; AVFormatContext *os = ofile->ctx; + AVChapter **tmp; int i; + tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters)); + if (!tmp) + return AVERROR(ENOMEM); + os->chapters = tmp; + for (i = 0; i < is->nb_chapters; i++) { AVChapter *in_ch = is->chapters[i], *out_ch; int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset, @@ -1112,11 +1118,7 @@ static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata) if (copy_metadata) av_dict_copy(&out_ch->metadata, in_ch->metadata, 0); - os->nb_chapters++; - os->chapters = av_realloc(os->chapters, sizeof(AVChapter) * os->nb_chapters); - if (!os->chapters) - return AVERROR(ENOMEM); - os->chapters[os->nb_chapters - 1] = out_ch; + os->chapters[os->nb_chapters++] = out_ch; } return 0; } -- cgit v1.2.3