[FFmpeg-devel] [PATCH v2 5/8] avformat/utils: Fix memleaks II
Andriy Gelman
andriy.gelman at gmail.com
Sun Aug 25 06:43:15 EEST 2019
Andreas,
On Mon, 19. Aug 23:56, Andreas Rheinhardt 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;
I wonder if you can get rid of this extra label by adding
the following in find_stream_info_err
if (pkt1.data)
av_packet_unref(&pkt1)
> }
>
> AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
Andriy
More information about the ffmpeg-devel
mailing list