[FFmpeg-devel] [PATCH] avcodec: add mvdv video decoder

Paul B Mahol onemda at gmail.com
Sun Nov 24 13:35:43 EET 2019


On 11/24/19, Tomas Härdin <tjoppen at acc.umu.se> wrote:
> sön 2019-11-24 klockan 11:12 +0100 skrev Paul B Mahol:
>> +static ptrdiff_t lzss_uncompress(MidiVidContext *s, GetByteContext *gb,
>> uint8_t *dst, int size)
>> +{
>> +    uint8_t *dst_start = dst;
>> +    uint8_t *dst_end = dst + size;
>> +
>> +    for (;bytestream2_get_bytes_left(gb) > 0;) {
>
> bytestream2_get_bytes_left(gb) >= 3 perhaps?

Changed.

>
>> +        int op = bytestream2_get_le16(gb);
>> +
>> +        for (int i = 0; i < 16; i++) {
>> +            if (op & 1) {
>> +                int s0 = bytestream2_get_byte(gb);
>> +                int s1 = bytestream2_get_byte(gb);
>> +                int offset = ((s0 & 0xF0) << 4) | s1;
>> +                int length = (s0 & 0xF) + 3;
>> +
>> +                if (dst + length >= dst_end ||
>
> Seems to be dst + length > dst_end should be enough

Changed.

>
>> +                    dst - offset < dst_start)
>> +                    return AVERROR_INVALIDDATA;
>> +                for (int j = 0; j < length; j++) {
>> +                    dst[j] = dst[j - offset];
>

> This is UB if offset == 0

Changed.

>
>> +                }
>> +                dst += length;
>> +            } else {
>> +                if (dst >= dst_end)
>> +                    return AVERROR_INVALIDDATA;
>> +                *dst++ = bytestream2_get_byte(gb);
>> +            }
>> +            op >>= 1;
>> +        }
>> +    }
>> +
>> +    return dst - dst_start;
>> +}
>> +
>> +static int decode_frame(AVCodecContext *avctx, void *data,
>> +                        int *got_frame, AVPacket *avpkt)
>> +{
>> +    MidiVidContext *s = avctx->priv_data;
>> +    GetByteContext *gb = &s->gb;
>> +    AVFrame *frame = s->frame;
>> +    int ret, key, uncompressed;
>> +
>> +    if (avpkt->size <= 13)
>> +        return AVERROR_INVALIDDATA;
>> +
>> +    bytestream2_init(gb, avpkt->data, avpkt->size);
>> +    bytestream2_skip(gb, 8);
>> +    uncompressed = bytestream2_get_le32(gb);
>> +
>> +    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
>> +        return ret;
>> +
>> +    if (uncompressed) {
>> +        ret = decode_mvdv(s, avctx, frame);
>> +    } else {
>> +        av_fast_padded_malloc(&s->uncompressed, &s->uncompressed_size,
>> 16LL * (avpkt->size - 12));
>
> Can avpkt->size be > LLONG_MAX/16+12 here?

No.

>
> /Tomas
>
> _______________________________________________
> 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