mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
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@gmail.com> Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
9e6ee46c7d
commit
e2307f4ff1
@ -640,26 +640,28 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
level = AV_LOG_ERROR;
|
||||
av_log(s, level, "Discarding ID3 tags because more suitable tags were found.\n");
|
||||
av_dict_free(&s->internal->id3v2_meta);
|
||||
if (s->error_recognition & AV_EF_EXPLODE)
|
||||
return AVERROR_INVALIDDATA;
|
||||
if (s->error_recognition & AV_EF_EXPLODE) {
|
||||
ret = AVERROR_INVALIDDATA;
|
||||
goto close;
|
||||
}
|
||||
}
|
||||
|
||||
if (id3v2_extra_meta) {
|
||||
if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
|
||||
!strcmp(s->iformat->name, "tta") || !strcmp(s->iformat->name, "wav")) {
|
||||
if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
|
||||
goto fail;
|
||||
goto close;
|
||||
if ((ret = ff_id3v2_parse_chapters(s, &id3v2_extra_meta)) < 0)
|
||||
goto fail;
|
||||
goto close;
|
||||
if ((ret = ff_id3v2_parse_priv(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");
|
||||
}
|
||||
ff_id3v2_free_extra_meta(&id3v2_extra_meta);
|
||||
|
||||
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);
|
||||
@ -678,6 +680,9 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
*ps = s;
|
||||
return 0;
|
||||
|
||||
close:
|
||||
if (s->iformat->read_close)
|
||||
s->iformat->read_close(s);
|
||||
fail:
|
||||
ff_id3v2_free_extra_meta(&id3v2_extra_meta);
|
||||
av_dict_free(&tmp);
|
||||
|
Loading…
Reference in New Issue
Block a user