@@ -1297,6 +1297,7 @@ static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
12971297{
12981298 OPJ_UINT32 bandno , cblkno ;
12991299 OPJ_UINT32 l_nb_code_blocks ;
1300+ int truncate ;
13001301 OPJ_BYTE * l_current_data = p_src_data ;
13011302 opj_tcd_band_t * l_band = 00 ;
13021303 opj_tcd_cblk_dec_t * l_cblk = 00 ;
@@ -1338,18 +1339,26 @@ static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
13381339 ++ l_cblk -> numsegs ;
13391340 }
13401341 }
1341-
1342+ truncate = 0 ;
13421343 do {
13431344 /* Check possible overflow (on l_current_data only, assumes input args already checked) then size */
1344- if ((((OPJ_SIZE_T )l_current_data + (OPJ_SIZE_T )l_seg -> newlen ) <
1345- (OPJ_SIZE_T )l_current_data ) ||
1346- (l_current_data + l_seg -> newlen > p_src_data + p_max_length )) {
1347- opj_event_msg (p_manager , EVT_ERROR ,
1348- "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n" ,
1349- l_seg -> newlen , p_max_length , cblkno , p_pi -> precno , bandno , p_pi -> resno ,
1350- p_pi -> compno );
1351- return OPJ_FALSE ;
1352- }
1345+ if ((((OPJ_SIZE_T )l_current_data + (OPJ_SIZE_T )l_seg -> newlen ) <
1346+ (OPJ_SIZE_T )l_current_data ) ||
1347+ (l_current_data + l_seg -> newlen > p_src_data + p_max_length )) {
1348+
1349+ //opj_event_msg(p_manager, EVT_WARNING,
1350+ // "read: segment too long (%d) current data (%d) p_src_data (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1351+ // l_seg->newlen, l_current_data, p_src_data, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
1352+ // p_pi->compno);
1353+ truncate = 1 ;
1354+ l_seg -> newlen = (OPJ_SIZE_T )(p_src_data + p_max_length - l_current_data );
1355+
1356+ //opj_event_msg(p_manager, EVT_ERROR,
1357+ // "read: segment too long (%d) current data (%d) p_src_data (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1358+ // l_seg->newlen, l_current_data, p_src_data, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
1359+ // p_pi->compno);
1360+ //return OPJ_FALSE;
1361+ }
13531362
13541363#ifdef USE_JPWL
13551364 /* we need here a j2k handle to verify if making a check to
@@ -1401,7 +1410,7 @@ static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
14011410 ++ l_seg ;
14021411 ++ l_cblk -> numsegs ;
14031412 }
1404- } while (l_cblk -> numnewpasses > 0 );
1413+ } while (l_cblk -> numnewpasses > 0 && ! truncate );
14051414
14061415 l_cblk -> real_num_segs = l_cblk -> numsegs ;
14071416 ++ l_cblk ;
@@ -1426,6 +1435,7 @@ static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
14261435{
14271436 OPJ_UINT32 bandno , cblkno ;
14281437 OPJ_UINT32 l_nb_code_blocks ;
1438+ int truncate ;
14291439 opj_tcd_band_t * l_band = 00 ;
14301440 opj_tcd_cblk_dec_t * l_cblk = 00 ;
14311441 opj_tcd_resolution_t * l_res =
@@ -1468,16 +1478,19 @@ static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
14681478 ++ l_cblk -> numsegs ;
14691479 }
14701480 }
1471-
1481+ truncate = 0 ;
14721482 do {
14731483 /* Check possible overflow then size */
14741484 if (((* p_data_read + l_seg -> newlen ) < (* p_data_read )) ||
14751485 ((* p_data_read + l_seg -> newlen ) > p_max_length )) {
1476- opj_event_msg (p_manager , EVT_ERROR ,
1477- "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n" ,
1478- l_seg -> newlen , p_max_length , cblkno , p_pi -> precno , bandno , p_pi -> resno ,
1479- p_pi -> compno );
1480- return OPJ_FALSE ;
1486+ //opj_event_msg(p_manager, EVT_ERROR,
1487+ // "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1488+ // l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
1489+ // p_pi->compno);
1490+ truncate = 1 ;
1491+ l_seg -> newlen = (OPJ_SIZE_T )(p_max_length - * p_data_read );
1492+
1493+ // return OPJ_FALSE;
14811494 }
14821495
14831496#ifdef USE_JPWL
@@ -1510,7 +1523,7 @@ static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
15101523 ++ l_seg ;
15111524 ++ l_cblk -> numsegs ;
15121525 }
1513- } while (l_cblk -> numnewpasses > 0 );
1526+ } while (l_cblk -> numnewpasses > 0 && ! truncate );
15141527
15151528 ++ l_cblk ;
15161529 }
0 commit comments