blob: d5328fc29fb4062b46b5ac53725bce54b14f3953 [file]
diff --git a/src/image.c b/src/image.c
index 017201a..9af8a06 100644
--- a/src/image.c
+++ b/src/image.c
@@ -160,9 +160,10 @@ void opj_image_comp_header_update(opj_image_t * p_image_header,
* @param p_image_src the src image
* @param p_image_dest the dest image
*
+ * @return OPJ_TRUE if successful, OPJ_FALSE otherwise.
*/
-void opj_copy_image_header(const opj_image_t* p_image_src,
- opj_image_t* p_image_dest)
+OPJ_BOOL opj_copy_image_header(const opj_image_t* p_image_src,
+ opj_image_t* p_image_dest)
{
OPJ_UINT32 compno;
@@ -170,6 +171,10 @@ void opj_copy_image_header(const opj_image_t* p_image_src,
assert(p_image_src != 00);
assert(p_image_dest != 00);
+ if (p_image_src->numcomps == 0 || !p_image_src->comps) {
+ return OPJ_FALSE;
+ }
+
p_image_dest->x0 = p_image_src->x0;
p_image_dest->y0 = p_image_src->y0;
p_image_dest->x1 = p_image_src->x1;
@@ -193,7 +198,7 @@ void opj_copy_image_header(const opj_image_t* p_image_src,
if (!p_image_dest->comps) {
p_image_dest->comps = NULL;
p_image_dest->numcomps = 0;
- return;
+ return OPJ_FALSE;
}
for (compno = 0; compno < p_image_dest->numcomps; compno++) {
@@ -212,7 +217,7 @@ void opj_copy_image_header(const opj_image_t* p_image_src,
if (!p_image_dest->icc_profile_buf) {
p_image_dest->icc_profile_buf = NULL;
p_image_dest->icc_profile_len = 0;
- return;
+ return OPJ_FALSE;
}
memcpy(p_image_dest->icc_profile_buf,
p_image_src->icc_profile_buf,
@@ -221,7 +226,7 @@ void opj_copy_image_header(const opj_image_t* p_image_src,
p_image_dest->icc_profile_buf = NULL;
}
- return;
+ return OPJ_TRUE;
}
opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts,
diff --git a/src/image.h b/src/image.h
index bad83c6..95c8d1a 100644
--- a/src/image.h
+++ b/src/image.h
@@ -61,8 +61,8 @@ opj_image_t* opj_image_create0(void);
void opj_image_comp_header_update(opj_image_t * p_image,
const struct opj_cp* p_cp);
-void opj_copy_image_header(const opj_image_t* p_image_src,
- opj_image_t* p_image_dest);
+OPJ_BOOL opj_copy_image_header(const opj_image_t* p_image_src,
+ opj_image_t* p_image_dest);
/*@}*/
diff --git a/src/j2k.c b/src/j2k.c
index 2835adb..6ddbcba 100644
--- a/src/j2k.c
+++ b/src/j2k.c
@@ -8546,7 +8546,11 @@ OPJ_BOOL opj_j2k_read_header(opj_stream_private_t *p_stream,
}
/* Copy codestream image information to the output image */
- opj_copy_image_header(p_j2k->m_private_image, *p_image);
+ if (!opj_copy_image_header(p_j2k->m_private_image, *p_image)) {
+ opj_image_destroy(*p_image);
+ *p_image = NULL;
+ return OPJ_FALSE;
+ }
return OPJ_TRUE;
}
@@ -12415,7 +12419,9 @@ OPJ_BOOL opj_j2k_decode(void * j2k,
opj_event_mgr_t * p_manager)
{
opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
- if (!p_image) {
+ /* The tile decoder uses the codestream component indices. */
+ if (!p_image || !p_image->comps || !p_j2k->m_private_image ||
+ p_image->numcomps != p_j2k->m_private_image->numcomps) {
return OPJ_FALSE;
}
@@ -12450,7 +12456,9 @@ OPJ_BOOL opj_j2k_decode(void * j2k,
return OPJ_FALSE;
}
}
- opj_copy_image_header(p_image, p_j2k->m_output_image);
+ if (!opj_copy_image_header(p_image, p_j2k->m_output_image)) {
+ return OPJ_FALSE;
+ }
/* customization of the decoding */
if (!opj_j2k_setup_decoding(p_j2k, p_manager)) {
@@ -12479,7 +12487,7 @@ OPJ_BOOL opj_j2k_get_tile(void *j2k,
OPJ_UINT32 l_tile_x, l_tile_y;
opj_image_comp_t* l_img_comp;
- if (!p_image) {
+ if (!p_image || !p_image->comps || !p_j2k->m_private_image) {
opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n");
return OPJ_FALSE;
}
@@ -12562,7 +12570,9 @@ OPJ_BOOL opj_j2k_get_tile(void *j2k,
if (!(p_j2k->m_output_image)) {
return OPJ_FALSE;
}
- opj_copy_image_header(p_image, p_j2k->m_output_image);
+ if (!opj_copy_image_header(p_image, p_j2k->m_output_image)) {
+ return OPJ_FALSE;
+ }
p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;
@@ -12822,7 +12832,9 @@ OPJ_BOOL opj_j2k_start_compress(void *j2k,
opj_event_msg(p_manager, EVT_ERROR, "Failed to allocate image header.");
return OPJ_FALSE;
}
- opj_copy_image_header(p_image, p_j2k->m_private_image);
+ if (!opj_copy_image_header(p_image, p_j2k->m_private_image)) {
+ return OPJ_FALSE;
+ }
/* TODO_MSD: Find a better way */
if (p_image->comps) {