summaryrefslogtreecommitdiff
path: root/openjpeg
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2018-10-31 20:22:11 +0100
committerSebastian Rasmussen <sebras@gmail.com>2019-09-04 15:54:22 +0200
commit1c6d485f4ba59072fba1a73f8f61071b00d7a7e6 (patch)
tree2bf79b9d4a3d0dca97df318f4da015585cd081fb /openjpeg
parentb7d32c453538bee41c34f8a77a3feb1dcc0ce759 (diff)
downloadghostpdl-1c6d485f4ba59072fba1a73f8f61071b00d7a7e6.tar.gz
Bug 700088: Report error if all wanted J2K components are not decoded.
Ghostscript used to attempt to use even the undecoded components. The source code for upstream's opj_decompress tool avoided this by a workaround along with a comment indicating that this ought to be done in the library (so all clients, e.g. Ghostscript will benefit from it). With this commit the library will error out if not all requested components are successfully decoded. Thus Ghostscript will no longer crash. Reported in https://github.com/uclouvain/openjpeg/issues/1158 sent upstream in https://github.com/uclouvain/openjpeg/pull/1164 and finally committed in e66125fe260deee49fdf6e9978d9bd29871dd5bb
Diffstat (limited to 'openjpeg')
-rw-r--r--openjpeg/src/bin/jp2/opj_decompress.c11
-rw-r--r--openjpeg/src/lib/openjp2/j2k.c44
2 files changed, 44 insertions, 11 deletions
diff --git a/openjpeg/src/bin/jp2/opj_decompress.c b/openjpeg/src/bin/jp2/opj_decompress.c
index 8c5a125df..1336bed5f 100644
--- a/openjpeg/src/bin/jp2/opj_decompress.c
+++ b/openjpeg/src/bin/jp2/opj_decompress.c
@@ -1570,17 +1570,6 @@ int main(int argc, char **argv)
}
}
- /* FIXME? Shouldn't that situation be considered as an error of */
- /* opj_decode() / opj_get_decoded_tile() ? */
- if (image->comps[0].data == NULL) {
- fprintf(stderr, "ERROR -> opj_decompress: no image data!\n");
- opj_destroy_codec(l_codec);
- opj_stream_destroy(l_stream);
- opj_image_destroy(image);
- failed = 1;
- goto fin;
- }
-
tCumulative += opj_clock() - t;
numDecompressedImages++;
diff --git a/openjpeg/src/lib/openjp2/j2k.c b/openjpeg/src/lib/openjp2/j2k.c
index 07b92d081..25e0a3486 100644
--- a/openjpeg/src/lib/openjp2/j2k.c
+++ b/openjpeg/src/lib/openjp2/j2k.c
@@ -10645,6 +10645,42 @@ static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k)
return OPJ_TRUE;
}
+static OPJ_BOOL opj_j2k_are_all_used_components_decoded(opj_j2k_t *p_j2k,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_UINT32 compno;
+ OPJ_BOOL decoded_all_used_components = OPJ_TRUE;
+
+ if (p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode) {
+ for (compno = 0;
+ compno < p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode; compno++) {
+ OPJ_UINT32 dec_compno =
+ p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode[compno];
+ if (p_j2k->m_output_image->comps[dec_compno].data == NULL) {
+ opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
+ dec_compno);
+ decoded_all_used_components = OPJ_FALSE;
+ }
+ }
+ } else {
+ for (compno = 0; compno < p_j2k->m_output_image->numcomps; compno++) {
+ if (p_j2k->m_output_image->comps[compno].data == NULL) {
+ opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
+ compno);
+ decoded_all_used_components = OPJ_FALSE;
+ }
+ }
+ }
+
+ if (decoded_all_used_components == OPJ_FALSE) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to decode all used components\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+
static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
opj_stream_private_t *p_stream,
opj_event_mgr_t * p_manager)
@@ -10756,6 +10792,10 @@ static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
}
}
+ if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
+ return OPJ_FALSE;
+ }
+
return OPJ_TRUE;
}
@@ -10884,6 +10924,10 @@ static OPJ_BOOL opj_j2k_decode_one_tile(opj_j2k_t *p_j2k,
}
+ if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
+ return OPJ_FALSE;
+ }
+
return OPJ_TRUE;
}