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 <l...@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 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel