@ -1051,7 +1051,7 @@ static int decode_block(AVCodecContext *avctx, void *tdata,
line_offset = AV_RL64 ( s - > gb . buffer + jobnr * 8 ) ;
if ( s - > is_tile ) {
if ( line_offset > buf_size - 20 )
if ( buf_size < 20 | | line_offset > buf_size - 20 )
return AVERROR_INVALIDDATA ;
src = buf + line_offset + 20 ;
@ -1062,7 +1062,7 @@ static int decode_block(AVCodecContext *avctx, void *tdata,
tile_level_y = AV_RL32 ( src - 8 ) ;
data_size = AV_RL32 ( src - 4 ) ;
if ( data_size < = 0 | | data_size > buf_size )
if ( data_size < = 0 | | data_size > buf_size - line_offset - 20 )
return AVERROR_INVALIDDATA ;
if ( tile_level_x | | tile_level_y ) { /* tile level, is not the full res level */
@ -1095,7 +1095,7 @@ static int decode_block(AVCodecContext *avctx, void *tdata,
td - > channel_line_size = td - > xsize * s - > current_channel_offset ; /* uncompress size of one line */
uncompressed_size = td - > channel_line_size * ( uint64_t ) td - > ysize ; /* uncompress size of the block */
} else {
if ( line_offset > buf_size - 8 )
if ( buf_size < 8 | | line_offset > buf_size - 8 )
return AVERROR_INVALIDDATA ;
src = buf + line_offset + 8 ;
@ -1105,7 +1105,7 @@ static int decode_block(AVCodecContext *avctx, void *tdata,
return AVERROR_INVALIDDATA ;
data_size = AV_RL32 ( src - 4 ) ;
if ( data_size < = 0 | | data_size > buf_size )
if ( data_size < = 0 | | data_size > buf_size - line_offset - 8 )
return AVERROR_INVALIDDATA ;
td - > ysize = FFMIN ( s - > scan_lines_per_block , s - > ymax - line + 1 ) ; /* s->ydelta - line ?? */