| Index: core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c
|
| diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c
|
| index 0a16d1e0e08fee75f5929ab7f7cff67df85f84fa..dd188c1ba73b4bd08f63572693d54f1f9c9f3af5 100644
|
| --- a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c
|
| +++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c
|
| @@ -537,12 +537,11 @@ OPJ_BOOL opj_jp2_read_ihdr( opj_jp2_t *jp2,
|
| p_image_header_data += 2;
|
|
|
| /* allocate memory for components */
|
| - jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
|
| + jp2->comps = (opj_jp2_comps_t*) opj_calloc(jp2->numcomps, sizeof(opj_jp2_comps_t));
|
| if (jp2->comps == 0) {
|
| opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle image header (ihdr)\n");
|
| return OPJ_FALSE;
|
| }
|
| - memset(jp2->comps,0,jp2->numcomps * sizeof(opj_jp2_comps_t));
|
|
|
| opj_read_bytes(p_image_header_data,&(jp2->bpc),1); /* BPC */
|
| ++ p_image_header_data;
|
| @@ -574,11 +573,10 @@ OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
|
| assert(p_nb_bytes_written != 00);
|
|
|
| /* default image header is 22 bytes wide */
|
| - l_ihdr_data = (OPJ_BYTE *) opj_malloc(22);
|
| + l_ihdr_data = (OPJ_BYTE *) opj_calloc(1,22);
|
| if (l_ihdr_data == 00) {
|
| return 00;
|
| }
|
| - memset(l_ihdr_data,0,22);
|
|
|
| l_current_ihdr_ptr = l_ihdr_data;
|
|
|
| @@ -627,11 +625,10 @@ OPJ_BYTE * opj_jp2_write_bpcc( opj_jp2_t *jp2,
|
| assert(jp2 != 00);
|
| assert(p_nb_bytes_written != 00);
|
|
|
| - l_bpcc_data = (OPJ_BYTE *) opj_malloc(l_bpcc_size);
|
| + l_bpcc_data = (OPJ_BYTE *) opj_calloc(1,l_bpcc_size);
|
| if (l_bpcc_data == 00) {
|
| return 00;
|
| }
|
| - memset(l_bpcc_data,0,l_bpcc_size);
|
|
|
| l_current_bpcc_ptr = l_bpcc_data;
|
|
|
| @@ -709,11 +706,10 @@ OPJ_BYTE * opj_jp2_write_colr( opj_jp2_t *jp2,
|
| return 00;
|
| }
|
|
|
| - l_colr_data = (OPJ_BYTE *) opj_malloc(l_colr_size);
|
| + l_colr_data = (OPJ_BYTE *) opj_calloc(1,l_colr_size);
|
| if (l_colr_data == 00) {
|
| return 00;
|
| }
|
| - memset(l_colr_data,0,l_colr_size);
|
|
|
| l_current_colr_ptr = l_colr_data;
|
|
|
| @@ -859,7 +855,11 @@ void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
|
| old_comps = image->comps;
|
| new_comps = (opj_image_comp_t*)
|
| opj_malloc(nr_channels * sizeof(opj_image_comp_t));
|
| -
|
| + if (!new_comps) {
|
| + /* FIXME no error code for opj_jp2_apply_pclr */
|
| + /* FIXME event manager error callback */
|
| + return;
|
| + }
|
| for(i = 0; i < nr_channels; ++i) {
|
| pcol = cmap[i].pcol; cmp = cmap[i].cmp;
|
|
|
| @@ -875,6 +875,13 @@ void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
|
| /* Palette mapping: */
|
| new_comps[i].data = (OPJ_INT32*)
|
| opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(OPJ_INT32));
|
| + if (!new_comps[i].data) {
|
| + opj_free(new_comps);
|
| + new_comps = NULL;
|
| + /* FIXME no error code for opj_jp2_apply_pclr */
|
| + /* FIXME event manager error callback */
|
| + return;
|
| + }
|
| new_comps[i].prec = channel_size[i];
|
| new_comps[i].sgnd = channel_sign[i];
|
| }
|
| @@ -1236,6 +1243,10 @@ OPJ_BOOL opj_jp2_read_colr( opj_jp2_t *jp2,
|
| ++p_colr_header_data;
|
|
|
| if (jp2->meth == 1) {
|
| + if (p_colr_header_size < 7) {
|
| + opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size: %d)\n", p_colr_header_size);
|
| + return OPJ_FALSE;
|
| + }
|
| if (p_colr_header_size > 7) {
|
| /* testcase Altona_Technical_v20_x4.pdf */
|
| opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header box (bad size: %d)\n", p_colr_header_size);
|
| @@ -1243,48 +1254,6 @@ OPJ_BOOL opj_jp2_read_colr( opj_jp2_t *jp2,
|
|
|
| opj_read_bytes(p_colr_header_data,&jp2->enumcs ,4); /* EnumCS */
|
|
|
| - p_colr_header_data += 4;
|
| -
|
| - if(jp2->enumcs == 14)/* CIELab */
|
| - {
|
| - OPJ_UINT32 *cielab;
|
| - OPJ_UINT32 rl, ol, ra, oa, rb, ob, il;
|
| -
|
| - cielab = (OPJ_UINT32*)opj_malloc(9 * sizeof(OPJ_UINT32));
|
| - cielab[0] = 14; /* enumcs */
|
| -
|
| - if(p_colr_header_size == 7)/* default values */
|
| - {
|
| - rl = ra = rb = ol = oa = ob = 0;
|
| - il = 0x00443530; /* D50 */
|
| - cielab[1] = 0x44454600;/* DEF */
|
| - }
|
| - else if(p_colr_header_size == 35)
|
| - {
|
| - opj_read_bytes(p_colr_header_data, &rl, 4);
|
| - p_colr_header_data += 4;
|
| - opj_read_bytes(p_colr_header_data, &ol, 4);
|
| - p_colr_header_data += 4;
|
| - opj_read_bytes(p_colr_header_data, &ra, 4);
|
| - p_colr_header_data += 4;
|
| - opj_read_bytes(p_colr_header_data, &oa, 4);
|
| - p_colr_header_data += 4;
|
| - opj_read_bytes(p_colr_header_data, &rb, 4);
|
| - p_colr_header_data += 4;
|
| - opj_read_bytes(p_colr_header_data, &ob, 4);
|
| - p_colr_header_data += 4;
|
| - opj_read_bytes(p_colr_header_data, &il, 4);
|
| - p_colr_header_data += 4;
|
| - cielab[1] = 0;
|
| - }
|
| - cielab[2] = rl; cielab[4] = ra; cielab[6] = rb;
|
| - cielab[3] = ol; cielab[5] = oa; cielab[7] = ob;
|
| - cielab[8] = il;
|
| -
|
| - jp2->color.icc_profile_buf = (unsigned char*)cielab;
|
| - jp2->color.icc_profile_len = 0;
|
| - }
|
| -
|
| jp2->color.jp2_has_colr = 1;
|
| }
|
| else if (jp2->meth == 2) {
|
| @@ -1293,13 +1262,12 @@ OPJ_BOOL opj_jp2_read_colr( opj_jp2_t *jp2,
|
| OPJ_INT32 icc_len = (OPJ_INT32)p_colr_header_size - 3;
|
|
|
| jp2->color.icc_profile_len = (OPJ_UINT32)icc_len;
|
| - jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_malloc((size_t)icc_len);
|
| + jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_calloc(1,(size_t)icc_len);
|
| if (!jp2->color.icc_profile_buf)
|
| {
|
| jp2->color.icc_profile_len = 0;
|
| return OPJ_FALSE;
|
| }
|
| - memset(jp2->color.icc_profile_buf, 0, (size_t)icc_len * sizeof(OPJ_BYTE));
|
|
|
| for (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value)
|
| {
|
| @@ -1312,7 +1280,7 @@ OPJ_BOOL opj_jp2_read_colr( opj_jp2_t *jp2,
|
| }
|
| else if (jp2->meth > 2)
|
| {
|
| - /* ISO/IEC 15444-1:2004 (E), Table I.9 ?Legal METH values:
|
| + /* ISO/IEC 15444-1:2004 (E), Table I.9 Legal METH values:
|
| conforming JP2 reader shall ignore the entire Colour Specification box.*/
|
| opj_event_msg(p_manager, EVT_INFO, "COLR BOX meth value is not a regular value (%d), "
|
| "so we will ignore the entire Colour Specification box. \n", jp2->meth);
|
| @@ -1361,7 +1329,6 @@ OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
|
| if( !jp2->color.jp2_pclr->cmap)
|
| opj_jp2_free_pclr(&(jp2->color));
|
| else
|
| - if(!p_image->useColorSpace)
|
| opj_jp2_apply_pclr(p_image, &(jp2->color));
|
| }
|
|
|
| @@ -1487,15 +1454,13 @@ OPJ_BOOL opj_jp2_write_ftyp(opj_jp2_t *jp2,
|
| assert(jp2 != 00);
|
| assert(p_manager != 00);
|
|
|
| - l_ftyp_data = (OPJ_BYTE *) opj_malloc(l_ftyp_size);
|
| + l_ftyp_data = (OPJ_BYTE *) opj_calloc(1,l_ftyp_size);
|
|
|
| if (l_ftyp_data == 00) {
|
| opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle ftyp data\n");
|
| return OPJ_FALSE;
|
| }
|
|
|
| - memset(l_ftyp_data,0,l_ftyp_size);
|
| -
|
| l_current_data_ptr = l_ftyp_data;
|
|
|
| opj_write_bytes(l_current_data_ptr, l_ftyp_size,4); /* box size */
|
| @@ -1606,7 +1571,7 @@ void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
|
| /* JP2 encoder interface */
|
| /* ----------------------------------------------------------------------- */
|
|
|
| -void opj_jp2_setup_encoder( opj_jp2_t *jp2,
|
| +OPJ_BOOL opj_jp2_setup_encoder( opj_jp2_t *jp2,
|
| opj_cparameters_t *parameters,
|
| opj_image_t *image,
|
| opj_event_mgr_t * p_manager)
|
| @@ -1616,7 +1581,7 @@ void opj_jp2_setup_encoder( opj_jp2_t *jp2,
|
| OPJ_UINT32 sign;
|
|
|
| if(!jp2 || !parameters || !image)
|
| - return;
|
| + return OPJ_FALSE;
|
|
|
| /* setup the J2K codec */
|
| /* ------------------- */
|
| @@ -1624,10 +1589,12 @@ void opj_jp2_setup_encoder( opj_jp2_t *jp2,
|
| /* Check if number of components respects standard */
|
| if (image->numcomps < 1 || image->numcomps > 16384) {
|
| opj_event_msg(p_manager, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n");
|
| - return;
|
| + return OPJ_FALSE;
|
| }
|
|
|
| - opj_j2k_setup_encoder(jp2->j2k, parameters, image, p_manager );
|
| + if (opj_j2k_setup_encoder(jp2->j2k, parameters, image, p_manager ) == OPJ_FALSE) {
|
| + return OPJ_FALSE;
|
| + }
|
|
|
| /* setup the JP2 codec */
|
| /* ------------------- */
|
| @@ -1638,22 +1605,23 @@ void opj_jp2_setup_encoder( opj_jp2_t *jp2,
|
| jp2->minversion = 0; /* MinV */
|
| jp2->numcl = 1;
|
| jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
|
| - if (!jp2->cl){
|
| - jp2->cl = NULL;
|
| - opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
|
| - return;
|
| - }
|
| + if (!jp2->cl){
|
| + jp2->cl = NULL;
|
| + opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
|
| + return OPJ_FALSE;
|
| + }
|
| jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */
|
|
|
| /* Image Header box */
|
|
|
| jp2->numcomps = image->numcomps; /* NC */
|
| jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
|
| - if (!jp2->comps) {
|
| - jp2->comps = NULL;
|
| - opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
|
| - return;
|
| - }
|
| + if (!jp2->comps) {
|
| + jp2->comps = NULL;
|
| + opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
|
| + /* Memory of jp2->cl will be freed by opj_jp2_destroy */
|
| + return OPJ_FALSE;
|
| + }
|
|
|
| jp2->h = image->y1 - image->y0; /* HEIGHT */
|
| jp2->w = image->x1 - image->x0; /* WIDTH */
|
| @@ -1696,6 +1664,8 @@ void opj_jp2_setup_encoder( opj_jp2_t *jp2,
|
| jp2->approx = 0; /* APPROX */
|
|
|
| jp2->jpip_on = parameters->jpip_on;
|
| +
|
| + return OPJ_TRUE;
|
| }
|
|
|
| OPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2,
|
| @@ -1846,13 +1816,12 @@ OPJ_BOOL opj_jp2_read_header_procedure( opj_jp2_t *jp2,
|
| assert(jp2 != 00);
|
| assert(p_manager != 00);
|
|
|
| - l_current_data = (OPJ_BYTE*)opj_malloc(l_last_data_size);
|
| + l_current_data = (OPJ_BYTE*)opj_calloc(1,l_last_data_size);
|
|
|
| if (l_current_data == 00) {
|
| opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 file header\n");
|
| return OPJ_FALSE;
|
| }
|
| - memset(l_current_data, 0 , l_last_data_size);
|
|
|
| while (opj_jp2_read_boxhdr(&box,&l_nb_bytes_read,stream,p_manager)) {
|
| /* is it the codestream box ? */
|
| @@ -1874,8 +1843,7 @@ OPJ_BOOL opj_jp2_read_header_procedure( opj_jp2_t *jp2,
|
| return OPJ_FALSE;
|
| }
|
| /* testcase 1851.pdf.SIGSEGV.ce9.948 */
|
| - /* testcase K-5787457125613568 */
|
| - else if (box.length < l_nb_bytes_read || box.length > opj_stream_get_number_byte_left(stream)) {
|
| + else if (box.length < l_nb_bytes_read) {
|
| opj_event_msg(p_manager, EVT_ERROR, "invalid box size %d (%x)\n", box.length, box.type);
|
| opj_free(l_current_data);
|
| return OPJ_FALSE;
|
| @@ -2123,12 +2091,11 @@ static OPJ_BOOL opj_jp2_read_ftyp( opj_jp2_t *jp2,
|
| /* div by 4 */
|
| jp2->numcl = l_remaining_bytes >> 2;
|
| if (jp2->numcl) {
|
| - jp2->cl = (OPJ_UINT32 *) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
|
| + jp2->cl = (OPJ_UINT32 *) opj_calloc(jp2->numcl, sizeof(OPJ_UINT32));
|
| if (jp2->cl == 00) {
|
| opj_event_msg(p_manager, EVT_ERROR, "Not enough memory with FTYP Box\n");
|
| return OPJ_FALSE;
|
| }
|
| - memset(jp2->cl,0,jp2->numcl * sizeof(OPJ_UINT32));
|
| }
|
|
|
| for (i = 0; i < jp2->numcl; ++i)
|
| @@ -2225,9 +2192,6 @@ static OPJ_BOOL opj_jp2_read_jp2h( opj_jp2_t *jp2,
|
| }
|
|
|
| l_current_handler = opj_jp2_img_find_handler(box.type);
|
| - //BUGID:0055999
|
| - //test file: fuzz-signal_sigsegv_6b88de_1123_2509.pdf
|
| - if (box.length < l_box_size) return OPJ_FALSE;
|
| l_current_data_size = box.length - l_box_size;
|
| p_header_data += l_box_size;
|
|
|
| @@ -2574,9 +2538,8 @@ OPJ_BOOL opj_jp2_get_tile( opj_jp2_t *p_jp2,
|
|
|
| opj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder)
|
| {
|
| - opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));
|
| + opj_jp2_t *jp2 = (opj_jp2_t*)opj_calloc(1,sizeof(opj_jp2_t));
|
| if (jp2) {
|
| - memset(jp2,0,sizeof(opj_jp2_t));
|
|
|
| /* create the J2K codec */
|
| if (! p_is_decoder) {
|
|
|