Index: core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c |
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c |
index de054acc545155409d58de65294899841510bab8..f2a7c9a57cbd659b127a3bc75bcc409327436619 100644 |
--- a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c |
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c |
@@ -218,7 +218,7 @@ OPJ_BOOL opj_t2_encode_packets( opj_t2_t* p_t2, |
opj_image_t *l_image = p_t2->image; |
opj_cp_t *l_cp = p_t2->cp; |
opj_tcp_t *l_tcp = &l_cp->tcps[p_tile_no]; |
- OPJ_UINT32 pocno = l_cp->m_specific_param.m_enc.m_cinema == OPJ_CINEMA4K_24? 2: 1; |
+ OPJ_UINT32 pocno = (l_cp->rsiz == OPJ_PROFILE_CINEMA_4K)? 2: 1; |
OPJ_UINT32 l_max_comp = l_cp->m_specific_param.m_enc.m_max_comp_size > 0 ? l_image->numcomps : 1; |
OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1; |
@@ -477,11 +477,10 @@ OPJ_BOOL opj_t2_decode_packets( opj_t2_t *p_t2, |
opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp) |
{ |
/* create the t2 structure */ |
- opj_t2_t *l_t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t)); |
+ opj_t2_t *l_t2 = (opj_t2_t*)opj_calloc(1,sizeof(opj_t2_t)); |
if (!l_t2) { |
return NULL; |
} |
- memset(l_t2,0,sizeof(opj_t2_t)); |
l_t2->image = p_image; |
l_t2->cp = p_cp; |
@@ -599,6 +598,10 @@ OPJ_BOOL opj_t2_encode_packet( OPJ_UINT32 tileno, |
} |
bio = opj_bio_create(); |
+ if (!bio) { |
+ /* FIXME event manager error callback */ |
+ return OPJ_FALSE; |
+ } |
opj_bio_init_enc(bio, c, length); |
opj_bio_write(bio, 1, 1); /* Empty header bit */ |
@@ -863,11 +866,10 @@ OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2, |
if (p_tcp->csty & J2K_CP_CSTY_SOP) { |
if (p_max_length < 6) { |
/* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, "Not enough space for expected SOP marker\n"); */ |
- printf("Not enough space for expected SOP marker\n"); |
+ fprintf(stderr, "Not enough space for expected SOP marker\n"); |
} else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) { |
/* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, "Expected SOP marker\n"); */ |
- printf("Expected SOP marker\n"); |
- fprintf(stderr, "Error : expected SOP marker\n"); |
+ fprintf(stderr, "Warning: expected SOP marker\n"); |
} else { |
l_current_data += 6; |
} |
@@ -917,7 +919,7 @@ OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2, |
/* EPH markers */ |
if (p_tcp->csty & J2K_CP_CSTY_EPH) { |
- if (p_max_length < 2) { |
+ if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data - *l_header_data_start)) < 2U) { |
fprintf(stderr, "Not enough space for expected EPH marker\n"); |
} else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) { |
fprintf(stderr, "Error : expected EPH marker\n"); |
@@ -1045,7 +1047,7 @@ OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2, |
/* EPH markers */ |
if (p_tcp->csty & J2K_CP_CSTY_EPH) { |
- if (p_max_length < 2) { |
+ if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data - *l_header_data_start)) < 2U) { |
fprintf(stderr, "Not enough space for expected EPH marker\n"); |
} else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) { |
/* TODO opj_event_msg(t2->cinfo->event_mgr, EVT_ERROR, "Expected EPH marker\n"); */ |
@@ -1129,7 +1131,8 @@ OPJ_BOOL opj_t2_read_packet_data( opj_t2_t* p_t2, |
} |
do { |
- if (l_current_data + l_seg->newlen > p_src_data + p_max_length) { |
+ /* Check possible overflow (on l_current_data only, assumes input args already checked) then size */ |
+ if (((OPJ_SIZE_T)(l_current_data + l_seg->newlen) < (OPJ_SIZE_T)l_current_data) || (l_current_data + l_seg->newlen > p_src_data + p_max_length)) { |
fprintf(stderr, "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n", |
l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno); |
return OPJ_FALSE; |
@@ -1154,11 +1157,18 @@ OPJ_BOOL opj_t2_read_packet_data( opj_t2_t* p_t2, |
}; |
#endif /* USE_JPWL */ |
+ /* Check possible overflow on size */ |
+ if ((l_cblk->data_current_size + l_seg->newlen) < l_cblk->data_current_size) { |
+ fprintf(stderr, "read: segment too long (%d) with current size (%d > %d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n", |
+ l_seg->newlen, l_cblk->data_current_size, 0xFFFFFFFF - l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno); |
+ return OPJ_FALSE; |
+ } |
/* Check if the cblk->data have allocated enough memory */ |
if ((l_cblk->data_current_size + l_seg->newlen) > l_cblk->data_max_size) { |
OPJ_BYTE* new_cblk_data = (OPJ_BYTE*) opj_realloc(l_cblk->data, l_cblk->data_current_size + l_seg->newlen); |
if(! new_cblk_data) { |
opj_free(l_cblk->data); |
+ l_cblk->data = NULL; |
l_cblk->data_max_size = 0; |
/* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to realloc code block cata!\n"); */ |
return OPJ_FALSE; |
@@ -1197,6 +1207,7 @@ OPJ_BOOL opj_t2_read_packet_data( opj_t2_t* p_t2, |
*(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data); |
+ |
return OPJ_TRUE; |
} |