[FFmpeg-devel] [PATCH 21/50] avformat/matroskadec: use av_packet_alloc() to allocate packets

James Almer jamrial at gmail.com
Mon Feb 8 17:37:47 EET 2021


On 2/8/2021 12:32 PM, Andreas Rheinhardt wrote:
> James Almer:
>> On 2/8/2021 12:22 PM, Andreas Rheinhardt wrote:
>>> James Almer:
>>>> Signed-off-by: James Almer <jamrial at gmail.com>
>>>> ---
>>>>    libavformat/matroskadec.c | 17 ++++++++++++-----
>>>>    1 file changed, 12 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
>>>> index 374831baa3..9fad78c78b 100644
>>>> --- a/libavformat/matroskadec.c
>>>> +++ b/libavformat/matroskadec.c
>>>> @@ -365,6 +365,8 @@ typedef struct MatroskaDemuxContext {
>>>>        /* byte position of the segment inside the stream */
>>>>        int64_t segment_start;
>>>>    +    AVPacket *pkt;
>>>> +
>>>>        /* the packet queue */
>>>>        AVPacketList *queue;
>>>>        AVPacketList *queue_end;
>>>> @@ -2885,6 +2887,10 @@ static int
>>>> matroska_read_header(AVFormatContext *s)
>>>>        }
>>>>        ebml_free(ebml_syntax, &ebml);
>>>>    +    matroska->pkt = av_packet_alloc();
>>>> +    if (!matroska->pkt)
>>>
>>> Missing AVERROR(ENOMEM).
>>
>> This seems to be a common mistake in this set. Sorry.
>>
> 
> Yeah, the failure paths seem untested.

make fate doesn't test failure paths. I recall someone did some manual 
runs limiting available memory long ago, which detected and removed a 
lot of unchecked av_mallocs, but nothing automated.
Fuzzing has handled failure path issue detection since then.

> 
>>> (I actually have an idea to completely remove the packet list from
>>> matroskadec.)
>>
>> Should i commit this while you work on that, or just withdraw this
>> patch? It's not urgent at all, since any deprecation period is 2+ years.
>> Either option is fine by me.
>>
> I don't want to have deprecation warnings.

Ok.

> 
>>>
>>>> +        goto fail;
>>>> +
>>>>        /* The next thing is a segment. */
>>>>        pos = avio_tell(matroska->ctx->pb);
>>>>        res = ebml_parse(matroska, matroska_segments, matroska);
>>>> @@ -2947,7 +2953,7 @@ static int matroska_read_header(AVFormatContext
>>>> *s)
>>>>                    st->disposition         |=
>>>> AV_DISPOSITION_ATTACHED_PIC;
>>>>                    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
>>>>    -                av_init_packet(pkt);
>>>> +                av_packet_unref(pkt);
>>>>                    pkt->buf          = attachments[j].bin.buf;
>>>>                    attachments[j].bin.buf = NULL;
>>>>                    pkt->data         = attachments[j].bin.data;
>>>> @@ -3180,7 +3186,7 @@ static int
>>>> matroska_parse_rm_audio(MatroskaDemuxContext *matroska,
>>>>          while (track->audio.pkt_cnt) {
>>>>            int ret;
>>>> -        AVPacket pktl, *pkt = &pktl;
>>>> +        AVPacket *pkt = matroska->pkt;
>>>>              ret = av_new_packet(pkt, a);
>>>>            if (ret < 0) {
>>>> @@ -3317,7 +3323,7 @@ static int
>>>> matroska_parse_webvtt(MatroskaDemuxContext *matroska,
>>>>                                     uint64_t duration,
>>>>                                     int64_t pos)
>>>>    {
>>>> -    AVPacket pktl, *pkt = &pktl;
>>>> +    AVPacket *pkt = matroska->pkt;
>>>>        uint8_t *id, *settings, *text, *buf;
>>>>        int id_len, settings_len, text_len;
>>>>        uint8_t *p, *q;
>>>> @@ -3434,7 +3440,7 @@ static int
>>>> matroska_parse_frame(MatroskaDemuxContext *matroska,
>>>>    {
>>>>        uint8_t *pkt_data = data;
>>>>        int res = 0;
>>>> -    AVPacket pktl, *pkt = &pktl;
>>>> +    AVPacket *pkt = matroska->pkt;
>>>>          if (st->codecpar->codec_id == AV_CODEC_ID_WAVPACK) {
>>>>            res = matroska_parse_wavpack(track, &pkt_data, &pkt_size);
>>>> @@ -3464,7 +3470,7 @@ static int
>>>> matroska_parse_frame(MatroskaDemuxContext *matroska,
>>>>        if (!pkt_size && !additional_size)
>>>>            goto no_output;
>>>>    -    av_init_packet(pkt);
>>>> +    av_packet_unref(pkt);
>>>>        if (!buf)
>>>>            pkt->buf = av_buffer_create(pkt_data, pkt_size +
>>>> AV_INPUT_BUFFER_PADDING_SIZE,
>>>>                                        NULL, NULL, 0);
>>>> @@ -3838,6 +3844,7 @@ static int matroska_read_close(AVFormatContext *s)
>>>>        int n;
>>>>          matroska_clear_queue(matroska);
>>>> +    av_packet_free(&matroska->pkt);
>>>>          for (n = 0; n < matroska->tracks.nb_elem; n++)
>>>>            if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO)
>>>>
>>>
>>> _______________________________________________
>>> 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".
>>>
>>
>> _______________________________________________
>> 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".
> 
> _______________________________________________
> 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".
> 



More information about the ffmpeg-devel mailing list