File openjpeg-CVE-2018-20846.patch of Package openjpeg.26661

Index: openjpeg-1.5.2/libopenjpeg/pi.c
===================================================================
--- openjpeg-1.5.2.orig/libopenjpeg/pi.c
+++ openjpeg-1.5.2/libopenjpeg/pi.c
@@ -106,6 +106,9 @@ static opj_bool pi_next_lrcp(opj_pi_iter
 				}
 				for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
 					index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+					if (index >= pi->include_size) {
+						return OPJ_FALSE;
+					}
 					if (!pi->include[index]) {
 						pi->include[index] = 1;
 						return OPJ_TRUE;
@@ -145,6 +148,9 @@ static opj_bool pi_next_rlcp(opj_pi_iter
 				}
 				for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
 					index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+					if (index >= pi->include_size) {
+						return OPJ_FALSE;
+					}
 					if (!pi->include[index]) {
 						pi->include[index] = 1;
 						return OPJ_TRUE;
@@ -234,6 +240,9 @@ if (!pi->tp_on){
 					pi->precno = prci + prcj * res->pw;
 					for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
 						index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+						if (index >= pi->include_size) {
+							return OPJ_FALSE;
+						}
 						if (!pi->include[index]) {
 							pi->include[index] = 1;
 							return OPJ_TRUE;
@@ -322,6 +331,9 @@ static opj_bool pi_next_pcrl(opj_pi_iter
 					pi->precno = prci + prcj * res->pw;
 					for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
 						index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+						if (index >= pi->include_size) {
+							return OPJ_FALSE;
+						}
 						if (!pi->include[index]) {
 							pi->include[index] = 1;
 							return OPJ_TRUE;
@@ -408,6 +420,9 @@ static opj_bool pi_next_cprl(opj_pi_iter
 					pi->precno = prci + prcj * res->pw;
 					for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
 						index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+						if (index >= pi->include_size) {
+							return OPJ_FALSE;
+						}
 						if (!pi->include[index]) {
 							pi->include[index] = 1;
 							return OPJ_TRUE;
@@ -523,7 +538,8 @@ opj_pi_iterator_t *pi_create_decode(opj_
 		pi[pino].step_l = maxres * pi[pino].step_r;
 		
 		if (pino == 0) {
-			pi[pino].include = (short int*) opj_calloc(image->numcomps * maxres * tcp->numlayers * maxprec, sizeof(short int));
+			pi[pino].include_size = image->numcomps * maxres * tcp->numlayers * maxprec;
+			pi[pino].include = (short int*) opj_calloc(pi[pino].include_size, sizeof(short int));
 			if(!pi[pino].include) {
 				/* TODO: throw an error */
 				pi_destroy(pi, cp, tileno);
@@ -532,6 +548,7 @@ opj_pi_iterator_t *pi_create_decode(opj_
 		}
 		else {
 			pi[pino].include = pi[pino - 1].include;
+			pi[pino].include_size = pi[pino - 1].include_size;
 		}
 		
 		if (tcp->POC == 0) {
@@ -663,7 +680,8 @@ opj_pi_iterator_t *pi_initialise_encode(
 		}
 
 		if (pino == 0) {
-			pi[pino].include = (short int*) opj_calloc(tcp->numlayers * pi[pino].step_l, sizeof(short int));
+			pi[pino].include_size = tcp->numlayers * pi[pino].step_l;
+			pi[pino].include = (short int*) opj_calloc(pi[pino].include_size, sizeof(short int));
 			if(!pi[pino].include) {
 				pi_destroy(pi, cp, tileno);
 				return NULL;
@@ -671,6 +689,7 @@ opj_pi_iterator_t *pi_initialise_encode(
 		}
 		else {
 			pi[pino].include = pi[pino - 1].include;
+			pi[pino].include_size = pi[pino - 1].include_size;
 		}
 		
 		/* Generation of boundaries for each prog flag*/
Index: openjpeg-1.5.2/libopenjpeg/pi.h
===================================================================
--- openjpeg-1.5.2.orig/libopenjpeg/pi.h
+++ openjpeg-1.5.2/libopenjpeg/pi.h
@@ -69,6 +69,8 @@ typedef struct opj_pi_iterator {
 	char tp_on;
 	/** precise if the packet has been already used (usefull for progression order change) */
 	short int *include;
+	/** Number of elements in include array */
+	int include_size;
 	/** layer step used to localize the packet in the include vector */
 	int step_l;
 	/** resolution step used to localize the packet in the include vector */
openSUSE Build Service is sponsored by