[FFmpeg-cvslog] avformat/utils: Fix memleaks in avformat_open_input()

Andreas Rheinhardt git at videolan.org
Fri Jul 3 20:29:28 EEST 2020

ffmpeg | branch: release/3.2 | Andreas Rheinhardt <andreas.rheinhardt at gmail.com> | Tue Jan  7 14:55:47 2020 +0100| [c9a8def8f23a024e0bce2ce7fe55f115a2fbc98e] | committer: Andreas Rheinhardt

avformat/utils: Fix memleaks in avformat_open_input()

A demuxer might have allocated memory while reading the header. If
reading the header was successfull and an error happens before returning
(e.g. when queueing the attached pictures), the read_close function
would have never been called, so that all those allocations would leak.
This commit changes this.

Furthermore, there would be even more memleaks if the error level was
set to AV_EF_EXPLODE in case there is both metadata and id3v2 metadata.
This has been fixed, too.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
Signed-off-by: Marton Balint <cus at passwd.hu>
(cherry picked from commit e2307f4ff197646a7feee0edbcdd2d3262932676)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c9a8def8f23a024e0bce2ce7fe55f115a2fbc98e

 libavformat/utils.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index db6865cd96..e14bd9be45 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -597,14 +597,14 @@ int avformat_open_input(AVFormatContext **ps, const char *filename,
         if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
             !strcmp(s->iformat->name, "tta")) {
             if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
-                goto fail;
+                goto close;
         } else
             av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
     if ((ret = avformat_queue_attached_pictures(s)) < 0)
-        goto fail;
+        goto close;
     if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
         s->internal->data_offset = avio_tell(s->pb);
@@ -623,6 +623,9 @@ int avformat_open_input(AVFormatContext **ps, const char *filename,
     *ps = s;
     return 0;
+    if (s->iformat->read_close)
+        s->iformat->read_close(s);

More information about the ffmpeg-cvslog mailing list