[FFmpeg-devel] [PATCH] avformat/hlsenc: fix memleak in hlsenc

Bodecs Bela bodecsb at vivanet.hu
Thu Jan 5 09:47:10 EET 2017



2017.01.05. 1:20 keltezéssel, Steven Liu írta:
> fix CID: 1398364 Resource leak
> refine the code of the new options
>
> Signed-off-by: Steven Liu <lq at chinaffmpeg.org>
> ---
>   libavformat/hlsenc.c | 21 +++++++++++++--------
>   1 file changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> index 808a797..feeb853 100644
> --- a/libavformat/hlsenc.c
> +++ b/libavformat/hlsenc.c
> @@ -446,11 +446,18 @@ static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, double
>       if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION)) &&
>           strlen(hls->current_segment_final_filename_fmt)) {
>           char * old_filename = av_strdup(hls->avf->filename);  // %%s will be %s after strftime
> +        if (!old_filename) {
> +            av_free(en);
> +            return AVERROR(ENOMEM);
> +        }
>           av_strlcpy(hls->avf->filename, hls->current_segment_final_filename_fmt, sizeof(hls->avf->filename));
> +        char * filename = av_strdup(hls->avf->filename);  // %%s will be %s after strftime
> +        if (!filename) {
> +            av_free(old_filename);
> +            av_free(en);
> +            return AVERROR(ENOMEM);
> +        }
>           if (hls->flags & HLS_SECOND_LEVEL_SEGMENT_SIZE) {
> -            char * filename = av_strdup(hls->avf->filename);  // %%s will be %s after strftime
> -            if (!filename)
> -                return AVERROR(ENOMEM);
>               if (replace_int_data_in_filename(hls->avf->filename, sizeof(hls->avf->filename),
>                   filename, 's', pos + size) < 1) {
>                   av_log(hls, AV_LOG_ERROR,
> @@ -459,14 +466,11 @@ static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, double
>                          filename);
>                   av_free(filename);
>                   av_free(old_filename);
> +                av_free(en);
>                   return AVERROR(EINVAL);
>               }
> -            av_free(filename);
>           }
>           if (hls->flags & HLS_SECOND_LEVEL_SEGMENT_DURATION) {
> -            char * filename = av_strdup(hls->avf->filename);  // %%t will be %t after strftime
> -            if (!filename)
> -                return AVERROR(ENOMEM);
>               if (replace_int_data_in_filename(hls->avf->filename, sizeof(hls->avf->filename),
>                   filename, 't',  (int64_t)round(1000000 * duration)) < 1) {
>                   av_log(hls, AV_LOG_ERROR,
> @@ -475,10 +479,11 @@ static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, double
>                          filename);
>                   av_free(filename);
>                   av_free(old_filename);
> +                av_free(en);
>                   return AVERROR(EINVAL);
>               }
> -            av_free(filename);
>           }
> +        av_free(filename);
>           ff_rename(old_filename, hls->avf->filename, hls);
>           av_free(old_filename);
>       }
if you remove av_strdup after if branch,  this way if

HLS_SECOND_LEVEL_SEGMENT_SIZE and HLS_SECOND_LEVEL_SEGMENT_DURATION also set, only later one will applied because filename will be the original one in second if branch.

bb



More information about the ffmpeg-devel mailing list