|
|
@@ -1001,10 +1001,18 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, |
|
|
|
|
|
|
|
if ((ret = get_bits(s, av_log2(newpasses1) + cblk->lblock)) < 0) |
|
|
|
return ret; |
|
|
|
if (ret > sizeof(cblk->data)) { |
|
|
|
if (ret > cblk->data_allocated) { |
|
|
|
size_t new_size = FFMAX(2*cblk->data_allocated, ret); |
|
|
|
void *new = av_realloc(cblk->data, new_size); |
|
|
|
if (new) { |
|
|
|
cblk->data = new; |
|
|
|
cblk->data_allocated = new_size; |
|
|
|
} |
|
|
|
} |
|
|
|
if (ret > cblk->data_allocated) { |
|
|
|
avpriv_request_sample(s->avctx, |
|
|
|
"Block with lengthinc greater than %"SIZE_SPECIFIER"", |
|
|
|
sizeof(cblk->data)); |
|
|
|
cblk->data_allocated); |
|
|
|
return AVERROR_PATCHWELCOME; |
|
|
|
} |
|
|
|
cblk->lengthinc[cblk->nb_lengthinc++] = ret; |
|
|
@@ -1030,8 +1038,16 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, |
|
|
|
for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) { |
|
|
|
Jpeg2000Cblk *cblk = prec->cblk + cblkno; |
|
|
|
for (cwsno = 0; cwsno < cblk->nb_lengthinc; cwsno ++) { |
|
|
|
if (cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4) { |
|
|
|
size_t new_size = FFMAX(2*cblk->data_allocated, cblk->length + cblk->lengthinc[cwsno] + 4); |
|
|
|
void *new = av_realloc(cblk->data, new_size); |
|
|
|
if (new) { |
|
|
|
cblk->data = new; |
|
|
|
cblk->data_allocated = new_size; |
|
|
|
} |
|
|
|
} |
|
|
|
if ( bytestream2_get_bytes_left(&s->g) < cblk->lengthinc[cwsno] |
|
|
|
|| sizeof(cblk->data) < cblk->length + cblk->lengthinc[cwsno] + 4 |
|
|
|
|| cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4 |
|
|
|
) { |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, |
|
|
|
"Block length %"PRIu16" or lengthinc %d is too large, left %d\n", |
|
|
|