[FFmpeg-devel] [PATCH v2 5/8] avformat/utils: Fix memleaks II
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Tue Aug 20 05:46:00 EEST 2019
mypopy at gmail.com:
> On Tue, Aug 20, 2019 at 6:11 AM Andreas Rheinhardt
> <andreas.rheinhardt at gmail.com> wrote:
>>
>> Up until now, avformat_find_stream_info had a potential for memleaks:
>> When everything is fine, it read packets and (depending upon whether
>> AVFMT_FLAG_NOBUFFER was set) put them in a packet list or unreferenced
>> them when they were no longer needed. But upon failure, said packets
>> would leak if they were not already on the packet list. This patch fixes
>> this.
>>
>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
>> ---
>> libavformat/utils.c | 10 +++++++---
>> 1 file changed, 7 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavformat/utils.c b/libavformat/utils.c
>> index bae2f9e0db..96c02bb7fc 100644
>> --- a/libavformat/utils.c
>> +++ b/libavformat/utils.c
>> @@ -3801,7 +3801,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
>> &ic->internal->packet_buffer_end,
>> &pkt1, 0);
>> if (ret < 0)
>> - goto find_stream_info_err;
>> + goto unref_then_goto_end;
>>
>> pkt = &ic->internal->packet_buffer_end->pkt;
>> } else {
>> @@ -3816,7 +3816,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
>> if (!st->internal->avctx_inited) {
>> ret = avcodec_parameters_to_context(avctx, st->codecpar);
>> if (ret < 0)
>> - goto find_stream_info_err;
>> + goto unref_then_goto_end;
>> st->internal->avctx_inited = 1;
>> }
>>
>> @@ -3904,7 +3904,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
>> if (!st->internal->avctx->extradata) {
>> ret = extract_extradata(st, pkt);
>> if (ret < 0)
>> - goto find_stream_info_err;
>> + goto unref_then_goto_end;
>> }
>>
>> /* If still no information, we try to open the codec and to
>> @@ -4180,6 +4180,10 @@ find_stream_info_err:
>> av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
>> avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
>> return ret;
>> +
>> +unref_then_goto_end:
>> + av_packet_unref(&pkt1);
>> + goto find_stream_info_err;
> goto follow a goto, you can just add av_packet_unref(&pkt1) before
> jump to the label find_stream_info_err.
But then I'd have to add three av_packet_unref.
- Andreas
More information about the ffmpeg-devel
mailing list