Blame SOURCES/jasper-CVE-2016-9392-CVE-2016-9393-CVE-2016-9394.patch

425a81
Backport of the upstream commit:
425a81
425a81
From f7038068550fba0e41e1d0c355787f1dcd5bf330 Mon Sep 17 00:00:00 2001
425a81
From: Michael Adams <mdadams@ece.uvic.ca>
425a81
Date: Thu, 27 Oct 2016 20:11:57 -0700
425a81
Subject: [PATCH] Added some missing sanity checks on the data in a SIZ marker
425a81
 segment.
425a81
425a81
diff -pruN jasper-1.900.1.orig/src/libjasper/jpc/jpc_cs.c jasper-1.900.1/src/libjasper/jpc/jpc_cs.c
425a81
--- jasper-1.900.1.orig/src/libjasper/jpc/jpc_cs.c	2017-03-29 22:30:41.000000000 +0200
425a81
+++ jasper-1.900.1/src/libjasper/jpc/jpc_cs.c	2017-03-29 22:48:20.267725023 +0200
425a81
@@ -483,6 +483,8 @@ static int jpc_siz_getparms(jpc_ms_t *ms
425a81
 	unsigned int i;
425a81
 	uint_fast8_t tmp;
425a81
 
425a81
+	siz->comps = 0;
425a81
+
425a81
 	/* Eliminate compiler warning about unused variables. */
425a81
 	cstate = 0;
425a81
 
425a81
@@ -496,44 +498,67 @@ static int jpc_siz_getparms(jpc_ms_t *ms
425a81
 	  jpc_getuint32(in, &siz->tilexoff) ||
425a81
 	  jpc_getuint32(in, &siz->tileyoff) ||
425a81
 	  jpc_getuint16(in, &siz->numcomps)) {
425a81
-		return -1;
425a81
+		goto error;
425a81
 	}
425a81
-	if (!siz->width || !siz->height || !siz->tilewidth ||
425a81
-	  !siz->tileheight || !siz->numcomps) {
425a81
-		return -1;
425a81
-	}
425a81
-	if (siz->tilexoff >= siz->width || siz->tileyoff >= siz->height) {
425a81
-		jas_eprintf("all tiles are outside the image area\n");
425a81
-		return -1;
425a81
+	if (!siz->width || !siz->height) {
425a81
+		jas_eprintf("reference grid cannot have zero area\n");
425a81
+		goto error;
425a81
+ 	}
425a81
+	if (!siz->tilewidth || !siz->tileheight) {
425a81
+		jas_eprintf("tile cannot have zero area\n");
425a81
+		goto error;
425a81
+	}
425a81
+	if (!siz->numcomps || siz->numcomps > 16384) {
425a81
+		jas_eprintf("number of components not in permissible range\n");
425a81
+		goto error;
425a81
+ 	}
425a81
+	if (siz->xoff >= siz->width) {
425a81
+		jas_eprintf("XOsiz not in permissible range\n");
425a81
+		goto error;
425a81
+	}
425a81
+	if (siz->yoff >= siz->height) {
425a81
+		jas_eprintf("YOsiz not in permissible range\n");
425a81
+		goto error;
425a81
+	}
425a81
+	if (siz->tilexoff > siz->xoff || siz->tilexoff + siz->tilewidth <= siz->xoff) {
425a81
+		jas_eprintf("XTOsiz not in permissible range\n");
425a81
+		goto error;
425a81
+	}
425a81
+	if (siz->tileyoff > siz->yoff || siz->tileyoff + siz->tileheight <= siz->yoff) {
425a81
+		jas_eprintf("YTOsiz not in permissible range\n");
425a81
+		goto error;
425a81
 	}
425a81
+
425a81
 	if (!(siz->comps = jas_alloc2(siz->numcomps, sizeof(jpc_sizcomp_t)))) {
425a81
-		return -1;
425a81
+		goto error;
425a81
 	}
425a81
 	for (i = 0; i < siz->numcomps; ++i) {
425a81
 		if (jpc_getuint8(in, &tmp) ||
425a81
 		  jpc_getuint8(in, &siz->comps[i].hsamp) ||
425a81
 		  jpc_getuint8(in, &siz->comps[i].vsamp)) {
425a81
-			jas_free(siz->comps);
425a81
-			return -1;
425a81
+			goto error;
425a81
 		}
425a81
 		if (siz->comps[i].hsamp == 0 || siz->comps[i].hsamp > 255) {
425a81
 			jas_eprintf("invalid XRsiz value %d\n", siz->comps[i].hsamp);
425a81
-			jas_free(siz->comps);
425a81
-			return -1;
425a81
+			goto error;
425a81
 		}
425a81
 		if (siz->comps[i].vsamp == 0 || siz->comps[i].vsamp > 255) {
425a81
 			jas_eprintf("invalid YRsiz value %d\n", siz->comps[i].vsamp);
425a81
-			jas_free(siz->comps);
425a81
-			return -1;
425a81
+			goto error;
425a81
 		}
425a81
 		siz->comps[i].sgnd = (tmp >> 7) & 1;
425a81
 		siz->comps[i].prec = (tmp & 0x7f) + 1;
425a81
 	}
425a81
 	if (jas_stream_eof(in)) {
425a81
-		jas_free(siz->comps);
425a81
-		return -1;
425a81
+		goto error;
425a81
 	}
425a81
 	return 0;
425a81
+
425a81
+error:
425a81
+	if (siz->comps) {
425a81
+		jas_free(siz->comps);
425a81
+	}
425a81
+	return -1;
425a81
 }
425a81
 
425a81
 static int jpc_siz_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out)