@@ -502,7 +502,6 @@ OPJ_BOOL opj_t2_decode_packets(opj_tcd_t* tcd,
502502 l_current_pi->precno, l_current_pi->layno, skip_packet ? "skipped" : "kept");
503503 */
504504 }
505-
506505 if (!skip_packet ) {
507506 l_nb_bytes_read = 0 ;
508507
@@ -1378,6 +1377,7 @@ static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
13781377 opj_tcd_cblk_dec_t * l_cblk = 00 ;
13791378 opj_tcd_resolution_t * l_res =
13801379 & p_tile -> comps [p_pi -> compno ].resolutions [p_pi -> resno ];
1380+ OPJ_BOOL partial_buffer = OPJ_FALSE ;
13811381
13821382 OPJ_ARG_NOT_USED (p_t2 );
13831383 OPJ_ARG_NOT_USED (pack_info );
@@ -1397,6 +1397,12 @@ static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
13971397 for (cblkno = 0 ; cblkno < l_nb_code_blocks ; ++ cblkno ) {
13981398 opj_tcd_seg_t * l_seg = 00 ;
13991399
1400+ // if we have a partial data stream, set numchunks to zero
1401+ // since we have no data to actually decode.
1402+ if (partial_buffer ) {
1403+ l_cblk -> numchunks = 0 ;
1404+ }
1405+
14001406 if (!l_cblk -> numnewpasses ) {
14011407 /* nothing to do */
14021408 ++ l_cblk ;
@@ -1419,12 +1425,32 @@ static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
14191425 /* Check possible overflow (on l_current_data only, assumes input args already checked) then size */
14201426 if ((((OPJ_SIZE_T )l_current_data + (OPJ_SIZE_T )l_seg -> newlen ) <
14211427 (OPJ_SIZE_T )l_current_data ) ||
1422- (l_current_data + l_seg -> newlen > p_src_data + p_max_length )) {
1423- opj_event_msg (p_manager , EVT_ERROR ,
1424- "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n" ,
1425- l_seg -> newlen , p_max_length , cblkno , p_pi -> precno , bandno , p_pi -> resno ,
1426- p_pi -> compno );
1427- return OPJ_FALSE ;
1428+ (l_current_data + l_seg -> newlen > p_src_data + p_max_length ) ||
1429+ (partial_buffer )) {
1430+ if (p_t2 -> cp -> strict ) {
1431+ opj_event_msg (p_manager , EVT_ERROR ,
1432+ "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n" ,
1433+ l_seg -> newlen , p_max_length , cblkno , p_pi -> precno , bandno , p_pi -> resno ,
1434+ p_pi -> compno );
1435+ return OPJ_FALSE ;
1436+ } else {
1437+ opj_event_msg (p_manager , EVT_WARNING ,
1438+ "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n" ,
1439+ l_seg -> newlen , p_max_length , cblkno , p_pi -> precno , bandno , p_pi -> resno ,
1440+ p_pi -> compno );
1441+ // skip this codeblock since it is a partial read
1442+ partial_buffer = OPJ_TRUE ;
1443+ l_cblk -> numchunks = 0 ;
1444+
1445+ l_seg -> numpasses += l_seg -> numnewpasses ;
1446+ l_cblk -> numnewpasses -= l_seg -> numnewpasses ;
1447+ if (l_cblk -> numnewpasses > 0 ) {
1448+ ++ l_seg ;
1449+ ++ l_cblk -> numsegs ;
1450+ break ;
1451+ }
1452+ continue ;
1453+ }
14281454 }
14291455
14301456#ifdef USE_JPWL
@@ -1486,8 +1512,12 @@ static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
14861512 ++ l_band ;
14871513 }
14881514
1489- * (p_data_read ) = (OPJ_UINT32 )(l_current_data - p_src_data );
1490-
1515+ // return the number of bytes read
1516+ if (partial_buffer ) {
1517+ * (p_data_read ) = p_max_length ;
1518+ } else {
1519+ * (p_data_read ) = (OPJ_UINT32 )(l_current_data - p_src_data );
1520+ }
14911521
14921522 return OPJ_TRUE ;
14931523}
@@ -1549,11 +1579,18 @@ static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
15491579 /* Check possible overflow then size */
15501580 if (((* p_data_read + l_seg -> newlen ) < (* p_data_read )) ||
15511581 ((* p_data_read + l_seg -> newlen ) > p_max_length )) {
1552- opj_event_msg (p_manager , EVT_ERROR ,
1553- "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n" ,
1554- l_seg -> newlen , p_max_length , cblkno , p_pi -> precno , bandno , p_pi -> resno ,
1555- p_pi -> compno );
1556- return OPJ_FALSE ;
1582+ if (p_t2 -> cp -> strict ) {
1583+ opj_event_msg (p_manager , EVT_ERROR ,
1584+ "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n" ,
1585+ l_seg -> newlen , p_max_length , cblkno , p_pi -> precno , bandno , p_pi -> resno ,
1586+ p_pi -> compno );
1587+ return OPJ_FALSE ;
1588+ } else {
1589+ opj_event_msg (p_manager , EVT_WARNING ,
1590+ "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n" ,
1591+ l_seg -> newlen , p_max_length , cblkno , p_pi -> precno , bandno , p_pi -> resno ,
1592+ p_pi -> compno );
1593+ }
15571594 }
15581595
15591596#ifdef USE_JPWL
0 commit comments