[FFmpeg-devel] [PATCH 04/16] avformat/hlsenc: Fix leak of options when initializing muxing fails
Steven Liu
lq at chinaffmpeg.org
Mon Dec 23 05:57:07 EET 2019
> 在 2019年12月16日,08:04,Andreas Rheinhardt <andreas.rheinhardt at gmail.com> 写道:
>
> hls_mux_init() currently leaks an AVDictionary if opening a dynamic
> buffer fails or if avformat_init_output fails. This has been fixed by
> moving the initialization resp. the freeing of the dictionary around:
> In the former case to a place after opening the dynamic buffer, in the
> latter to a place before the check for initialization failure so that it
> is done unconditionally.
>
> Furthermore, the dictionary is now only copied and freed if the options
> in it are actually used (namely when in SEGMENT_TYPE_FMP4 mode).
>
> Finally, a similar situation in hls_start() has been fixed, too.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> libavformat/hlsenc.c | 18 ++++++++++--------
> 1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> index 87bbfb8086..5695af2208 100644
> --- a/libavformat/hlsenc.c
> +++ b/libavformat/hlsenc.c
> @@ -835,18 +835,19 @@ static int hls_mux_init(AVFormatContext *s, VariantStream *vs)
>
> vs->packets_written = 0;
> vs->init_range_length = 0;
> - set_http_options(s, &options, hls);
> +
> if ((ret = avio_open_dyn_buf(&oc->pb)) < 0)
> return ret;
>
> if (hls->segment_type == SEGMENT_TYPE_FMP4) {
> + set_http_options(s, &options, hls);
> if (byterange_mode) {
> ret = hlsenc_io_open(s, &vs->out, vs->basename, &options);
> } else {
> ret = hlsenc_io_open(s, &vs->out, vs->base_output_dirname, &options);
> }
> + av_dict_free(&options);
> }
> - av_dict_free(&options);
> if (ret < 0) {
> av_log(s, AV_LOG_ERROR, "Failed to open segment '%s'\n", vs->fmp4_init_filename);
> return ret;
> @@ -861,21 +862,23 @@ static int hls_mux_init(AVFormatContext *s, VariantStream *vs)
> }
> }
>
> - av_dict_copy(&options, hls->format_options, 0);
> if (hls->segment_type == SEGMENT_TYPE_FMP4) {
> + int remaining_options;
> +
> + av_dict_copy(&options, hls->format_options, 0);
> av_dict_set(&options, "fflags", "-autobsf", 0);
> av_dict_set(&options, "movflags", "+frag_custom+dash+delay_moov", AV_DICT_APPEND);
> ret = avformat_init_output(oc, &options);
> + remaining_options = av_dict_count(options);
> + av_dict_free(&options);
> if (ret < 0)
> return ret;
> - if (av_dict_count(options)) {
> + if (remaining_options) {
> av_log(s, AV_LOG_ERROR, "Some of the provided format options in '%s' are not recognized\n", hls->format_options_str);
> - av_dict_free(&options);
> return AVERROR(EINVAL);
> }
> }
> avio_flush(oc->pb);
> - av_dict_free(&options);
> return 0;
> }
>
> @@ -1650,8 +1653,6 @@ static int hls_start(AVFormatContext *s, VariantStream *vs)
> }
> vs->number++;
>
> - set_http_options(s, &options, c);
> -
> proto = avio_find_protocol_name(oc->url);
> use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE);
>
> @@ -1702,6 +1703,7 @@ static int hls_start(AVFormatContext *s, VariantStream *vs)
> av_opt_set(oc->priv_data, "pat_period", period, 0);
> }
> if (c->flags & HLS_SINGLE_FILE) {
> + set_http_options(s, &options, c);
> if ((err = hlsenc_io_open(s, &vs->out, oc->url, &options)) < 0) {
> if (c->ignore_io_errors)
> err = 0;
> --
> 2.20.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe”.
LGTM
Thanks
Steven
More information about the ffmpeg-devel
mailing list