From 8b5f815925b1776f1d21997f4aa3e139cae356ac Mon Sep 17 00:00:00 2001 From: Mathieu Malaterre Date: Wed, 11 Jul 2012 14:54:48 +0000 Subject: [PATCH] [1.5] This fixes issues seen on PDF files Fixes issue 156 --- libopenjpeg/j2k.c | 17 +++++++++++------ libopenjpeg/tcd.c | 6 ++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/libopenjpeg/j2k.c b/libopenjpeg/j2k.c index 0a73e9b3..ec0c29b2 100644 --- a/libopenjpeg/j2k.c +++ b/libopenjpeg/j2k.c @@ -1602,7 +1602,7 @@ static void j2k_write_eoc(opj_j2k_t *j2k) { static void j2k_read_eoc(opj_j2k_t *j2k) { int i, tileno; - opj_bool success; + opj_bool success = false; /* if packets should be decoded */ if (j2k->cp->limit_decoding != DECODE_ALL_BUT_PACKETS) { @@ -1610,11 +1610,16 @@ static void j2k_read_eoc(opj_j2k_t *j2k) { tcd_malloc_decode(tcd, j2k->image, j2k->cp); for (i = 0; i < j2k->cp->tileno_size; i++) { tcd_malloc_decode_tile(tcd, j2k->image, j2k->cp, i, j2k->cstr_info); - tileno = j2k->cp->tileno[i]; - success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno, j2k->cstr_info); - opj_free(j2k->tile_data[tileno]); - j2k->tile_data[tileno] = NULL; - tcd_free_decode_tile(tcd, i); + if (j2k->cp->tileno[i] != -1) + { + tileno = j2k->cp->tileno[i]; + success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno, j2k->cstr_info); + opj_free(j2k->tile_data[tileno]); + j2k->tile_data[tileno] = NULL; + tcd_free_decode_tile(tcd, i); + } + else + success = false; if (success == OPJ_FALSE) { j2k->state |= J2K_STATE_ERR; break; diff --git a/libopenjpeg/tcd.c b/libopenjpeg/tcd.c index 839ca7c3..eb6237d7 100644 --- a/libopenjpeg/tcd.c +++ b/libopenjpeg/tcd.c @@ -695,6 +695,12 @@ void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, opj_tccp_t *tccp = &tcp->tccps[compno]; opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + if (tccp->numresolutions <= 0) + { + cp->tileno[tileno] = -1; + return; + } + /* border of each tile component (global) */ tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);