return 0;
}
-static uint8_t get_plt(Jpeg2000DecoderContext *s, int n)
+static int get_plt(Jpeg2000DecoderContext *s, int n)
{
int i;
+ int v;
av_log(s->avctx, AV_LOG_DEBUG,
"PLT marker at pos 0x%X\n", bytestream2_tell(&s->g) - 4);
+ if (n < 4)
+ return AVERROR_INVALIDDATA;
+
/*Zplt =*/ bytestream2_get_byte(&s->g);
for (i = 0; i < n - 3; i++) {
- bytestream2_get_byte(&s->g);
+ v = bytestream2_get_byte(&s->g);
}
+ if (v & 0x80)
+ return AVERROR_INVALIDDATA;
return 0;
}
step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
}
- av_assert0(step_x < 32 && step_y < 32);
+ if (step_x >= 31 || step_y >= 31){
+ avpriv_request_sample(s->avctx, "CPRL with large step");
+ return AVERROR_PATCHWELCOME;
+ }
step_x = 1<<step_x;
step_y = 1<<step_y;
bandpos);
if (ret)
coded = 1;
+ else
+ continue;
x = cblk->coord[0][0] - band->coord[0][0];
y = cblk->coord[1][0] - band->coord[1][0];