X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fhuffyuvdec.c;h=27f650d7bf963e2657a30e093dfb08fd4d8f758a;hb=b2f32d60eeaf883bb7d9e1b8cc2fb9a983d08f72;hp=dfe3585e6e6e78826a864b03e27e75dbcf7965e9;hpb=96e495082aedc4fcf444e2c7ef301867ba3e0b1f;p=ffmpeg diff --git a/libavcodec/huffyuvdec.c b/libavcodec/huffyuvdec.c index dfe3585e6e6..27f650d7bf9 100644 --- a/libavcodec/huffyuvdec.c +++ b/libavcodec/huffyuvdec.c @@ -1254,7 +1254,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, slices_info_offset = AV_RL32(avpkt->data + buf_size - 4); slice_height = AV_RL32(avpkt->data + buf_size - 8); nb_slices = AV_RL32(avpkt->data + buf_size - 12); - if (nb_slices * 8LL + slices_info_offset > buf_size - 16 || slice_height <= 0) + if (nb_slices * 8LL + slices_info_offset > buf_size - 16 || + slice_height <= 0 || nb_slices * (uint64_t)slice_height > height) return AVERROR_INVALIDDATA; } else { slice_height = height; @@ -1267,6 +1268,11 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, if (nb_slices > 1) { slice_offset = AV_RL32(avpkt->data + slices_info_offset + slice * 8); slice_size = AV_RL32(avpkt->data + slices_info_offset + slice * 8 + 4); + + if (slice_offset < 0 || slice_size <= 0 || (slice_offset&3) || + slice_offset + (int64_t)slice_size > buf_size) + return AVERROR_INVALIDDATA; + y_offset = height - (slice + 1) * slice_height; s->bdsp.bswap_buf((uint32_t *)s->bitstream_buffer, (const uint32_t *)(buf + slice_offset), slice_size / 4);