Thank you for your patient response! I have submitted the new patch as 
requested. The link is 
https://patchwork.ffmpeg.org/project/ffmpeg/patch/20240412164441.1727089-1-lumingyindet...@163.com/

















At 2024-04-12 21:41:25, "James Almer" <jamr...@gmail.com> wrote:
>On 4/12/2024 10:09 AM, LuMingYin wrote:
>> In the file ffmpeg_mux_init.c located at /FFmpeg/fftools/, a pointer 
>> variable named pts is defined at line 2830. At line 2836, this pointer is 
>> allocated a dynamic memory area using the function av_malloc_array. When the 
>> if statement at line 2852 evaluates to true, there are two possible 
>> scenarios. The first scenario is when nb_ch > INT_MAX - size. In this case, 
>> the program should release the dynamic memory area pointed to by pts before 
>> returning. The second scenario is when the realloc operation for the pts 
>> pointer fails. In this case, since the av_realloc_f function releases the 
>> original memory in case of reallocation failure, there is no need to release 
>> the memory area pointed to by pts. Because the handling of these two 
>> scenarios differs, to fix the memory leak issue caused by the first 
>> scenario, my patch separates the treatment of these cases.
>> 
>> Signed-off-by: LuMingYin <lumingyindet...@163.com>
>> ---
>>   fftools/ffmpeg_mux_init.c | 8 ++++++--
>>   1 file changed, 6 insertions(+), 2 deletions(-)
>> 
>> diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
>> index 6d8bd5bcdf..1f27e4e4f4 100644
>> --- a/fftools/ffmpeg_mux_init.c
>> +++ b/fftools/ffmpeg_mux_init.c
>> @@ -2849,8 +2849,12 @@ static int parse_forced_key_frames(void *log, 
>> KeyframeForceCtx *kf,
>>               unsigned int    nb_ch = mux->fc->nb_chapters;
>>               int j;
>>   
>> -            if (nb_ch > INT_MAX - size ||
>> -                !(pts = av_realloc_f(pts, size += nb_ch - 1,
>> +            if (nb_ch > INT_MAX - size) {
>> +                av_freep(&pts);
>> +                return AVERROR(ENOMEM);
>
>There's a fail label at the end that frees pts. You should set ret to 
>AVERROR(ENOMEM) and goto it.
>
>An alternative could be something like
>
>> diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
>> index 1d0a210450..0d93f0eff2 100644
>> --- a/fftools/ffmpeg_mux_init.c
>> +++ b/fftools/ffmpeg_mux_init.c
>> @@ -2959,10 +2959,11 @@ static int parse_forced_key_frames(void *log, 
>> KeyframeForceCtx *kf,
>>              unsigned int    nb_ch = mux->fc->nb_chapters;
>>              int j;
>> 
>> -            if (nb_ch > INT_MAX - size ||
>> -                !(pts = av_realloc_f(pts, size += nb_ch - 1,
>> -                                     sizeof(*pts))))
>> -                return AVERROR(ENOMEM);
>> +            if (nb_ch > (INT_MAX - size) / sizeof(*pts) ||
>> +                av_reallocp(&pts, (size += nb_ch - 1) * sizeof(*pts))) {
>> +                ret = AVERROR(ENOMEM);
>> +                goto fail;
>> +            }
>> 
>>              if (p[8]) {
>>                  ret = av_parse_time(&t, p + 8, 1);
>
>Where av_reallocp() will set pts to NULL after freeing, so the free in 
>the fail label will be a no-op, and we always jump to fail on failure in 
>case it's extended to do further cleaning.
>_______________________________________________
>ffmpeg-devel mailing list
>ffmpeg-devel@ffmpeg.org
>https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>To unsubscribe, visit link above, or email
>ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to