* gnu/packages/image.scm (freeimage)[source]: Add patches. * gnu/packages/patches/freeimage-CVE-2020-21428.patch, gnu/packages/patches/freeimage-CVE-2020-22524.patch: New files. * gnu/local.mk (dist_patch_DATA): Register them. Change-Id: Iec114f2295cafbc8b55e81c0d8e4a361fd653152
		
			
				
	
	
		
			229 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			229 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
https://sources.debian.org/data/main/f/freeimage/3.18.0%2Bds2-10/debian/patches/r1848-improved-PFM-plugin-against-malicious-images.patch
 | 
						|
 | 
						|
Origin: upstream, r1848
 | 
						|
Index: Source/FreeImage/PluginPFM.cpp
 | 
						|
---
 | 
						|
diff --git a/Source/FreeImage/PluginPFM.cpp b/Source/FreeImage/PluginPFM.cpp
 | 
						|
--- a/Source/FreeImage/PluginPFM.cpp	(revision 1847)
 | 
						|
+++ b/Source/FreeImage/PluginPFM.cpp	(revision 1848)
 | 
						|
@@ -23,6 +23,12 @@
 | 
						|
 #include "Utilities.h"
 | 
						|
 
 | 
						|
 // ==========================================================
 | 
						|
+// Plugin Interface
 | 
						|
+// ==========================================================
 | 
						|
+
 | 
						|
+static int s_format_id;
 | 
						|
+
 | 
						|
+// ==========================================================
 | 
						|
 // Internal functions
 | 
						|
 // ==========================================================
 | 
						|
 
 | 
						|
@@ -59,6 +65,9 @@
 | 
						|
 
 | 
						|
 /**
 | 
						|
 Get an integer value from the actual position pointed by handle
 | 
						|
+@param io
 | 
						|
+@param handle
 | 
						|
+@return Returns -1 in case of failure, returns the found number otherwise
 | 
						|
 */
 | 
						|
 static int
 | 
						|
 pfm_get_int(FreeImageIO *io, fi_handle handle) {
 | 
						|
@@ -65,70 +74,72 @@
 | 
						|
     char c = 0;
 | 
						|
 	BOOL bFirstChar;
 | 
						|
 
 | 
						|
-    // skip forward to start of next number
 | 
						|
+	try {
 | 
						|
 
 | 
						|
-	if(!io->read_proc(&c, 1, 1, handle)) {
 | 
						|
-		throw FI_MSG_ERROR_PARSING;
 | 
						|
-	}
 | 
						|
+		// skip forward to start of next number
 | 
						|
 
 | 
						|
-    while (1) {
 | 
						|
-        // eat comments
 | 
						|
+		if (io->read_proc(&c, 1, 1, handle) != 1) {
 | 
						|
+			throw FI_MSG_ERROR_PARSING;
 | 
						|
+		}
 | 
						|
 
 | 
						|
-        if (c == '#') {
 | 
						|
-			// if we're at a comment, read to end of line
 | 
						|
+		while (1) {
 | 
						|
+			// eat comments
 | 
						|
 
 | 
						|
-            bFirstChar = TRUE;
 | 
						|
+			if (c == '#') {
 | 
						|
+				// if we're at a comment, read to end of line
 | 
						|
 
 | 
						|
-            while (1) {
 | 
						|
-				if(!io->read_proc(&c, 1, 1, handle)) {
 | 
						|
-					throw FI_MSG_ERROR_PARSING;
 | 
						|
-				}
 | 
						|
+				bFirstChar = TRUE;
 | 
						|
 
 | 
						|
-				if (bFirstChar && c == ' ') {
 | 
						|
-					// loop off 1 sp after #
 | 
						|
-					bFirstChar = FALSE;
 | 
						|
-				} else if (c == '\n') {
 | 
						|
-					break;
 | 
						|
+				while (1) {
 | 
						|
+					if (io->read_proc(&c, 1, 1, handle) != 1) {
 | 
						|
+						throw FI_MSG_ERROR_PARSING;
 | 
						|
+					}
 | 
						|
+
 | 
						|
+					if (bFirstChar && c == ' ') {
 | 
						|
+						// loop off 1 sp after #
 | 
						|
+						bFirstChar = FALSE;
 | 
						|
+					}
 | 
						|
+					else if (c == '\n') {
 | 
						|
+						break;
 | 
						|
+					}
 | 
						|
 				}
 | 
						|
 			}
 | 
						|
-		}
 | 
						|
 
 | 
						|
-        if (c >= '0' && c <='9') {
 | 
						|
-			// we've found what we were looking for
 | 
						|
-            break;
 | 
						|
-		}
 | 
						|
+			if (c >= '0' && c <= '9') {
 | 
						|
+				// we've found what we were looking for
 | 
						|
+				break;
 | 
						|
+			}
 | 
						|
 
 | 
						|
-		if(!io->read_proc(&c, 1, 1, handle)) {
 | 
						|
-			throw FI_MSG_ERROR_PARSING;
 | 
						|
+			if (io->read_proc(&c, 1, 1, handle) != 1) {
 | 
						|
+				throw FI_MSG_ERROR_PARSING;
 | 
						|
+			}
 | 
						|
 		}
 | 
						|
-    }
 | 
						|
 
 | 
						|
-    // we're at the start of a number, continue until we hit a non-number
 | 
						|
+		// we're at the start of a number, continue until we hit a non-number
 | 
						|
 
 | 
						|
-    int i = 0;
 | 
						|
+		int i = 0;
 | 
						|
 
 | 
						|
-    while (1) {
 | 
						|
-        i = (i * 10) + (c - '0');
 | 
						|
+		while (1) {
 | 
						|
+			i = (i * 10) + (c - '0');
 | 
						|
 
 | 
						|
-		if(!io->read_proc(&c, 1, 1, handle)) {
 | 
						|
-			throw FI_MSG_ERROR_PARSING;
 | 
						|
-		}
 | 
						|
+			if (io->read_proc(&c, 1, 1, handle) != 1) {
 | 
						|
+				throw FI_MSG_ERROR_PARSING;
 | 
						|
+			}
 | 
						|
 
 | 
						|
-		if (c < '0' || c > '9') {
 | 
						|
-			break;
 | 
						|
+			if (c < '0' || c > '9') {
 | 
						|
+				break;
 | 
						|
+			}
 | 
						|
 		}
 | 
						|
-    }
 | 
						|
 
 | 
						|
-    return i;
 | 
						|
+		return i;
 | 
						|
+	}
 | 
						|
+	catch (const char *message) {
 | 
						|
+		FreeImage_OutputMessageProc(s_format_id, message);
 | 
						|
+		return -1;
 | 
						|
+	}
 | 
						|
 }
 | 
						|
 
 | 
						|
 // ==========================================================
 | 
						|
-// Plugin Interface
 | 
						|
-// ==========================================================
 | 
						|
-
 | 
						|
-static int s_format_id;
 | 
						|
-
 | 
						|
-// ==========================================================
 | 
						|
 // Plugin Implementation
 | 
						|
 // ==========================================================
 | 
						|
 
 | 
						|
@@ -230,8 +241,12 @@
 | 
						|
 		}
 | 
						|
 
 | 
						|
 		// Read the header information: width, height and the scale value
 | 
						|
-		unsigned width  = (unsigned) pfm_get_int(io, handle);
 | 
						|
-		unsigned height = (unsigned) pfm_get_int(io, handle);
 | 
						|
+		int width = pfm_get_int(io, handle);
 | 
						|
+		int height = pfm_get_int(io, handle);
 | 
						|
+		if ((width <= 0) || (height <= 0)) {
 | 
						|
+			throw FI_MSG_ERROR_PARSING;
 | 
						|
+		}
 | 
						|
+
 | 
						|
 		float scalefactor = 1;
 | 
						|
 
 | 
						|
 		BOOL bResult = pfm_get_line(io, handle, line_buffer, PFM_MAXLINE);
 | 
						|
@@ -262,7 +277,7 @@
 | 
						|
 				throw FI_MSG_ERROR_MEMORY;
 | 
						|
 			}
 | 
						|
 
 | 
						|
-			for (unsigned y = 0; y < height; y++) {	
 | 
						|
+			for (int y = 0; y < height; y++) {	
 | 
						|
 				FIRGBF *bits = (FIRGBF*)FreeImage_GetScanLine(dib, height - 1 - y);
 | 
						|
 
 | 
						|
 				if(io->read_proc(lineBuffer, sizeof(float), lineWidth, handle) != lineWidth) {
 | 
						|
@@ -271,7 +286,7 @@
 | 
						|
 				float *channel = lineBuffer;
 | 
						|
 				if(scalefactor > 0) {
 | 
						|
 					// MSB
 | 
						|
-					for (unsigned x = 0; x < width; x++) {
 | 
						|
+					for (int x = 0; x < width; x++) {
 | 
						|
 						REVERSEBYTES(channel++, &bits[x].red);
 | 
						|
 						REVERSEBYTES(channel++, &bits[x].green);
 | 
						|
 						REVERSEBYTES(channel++, &bits[x].blue);
 | 
						|
@@ -278,7 +293,7 @@
 | 
						|
 					}
 | 
						|
 				} else {
 | 
						|
 					// LSB					
 | 
						|
-					for (unsigned x = 0; x < width; x++) {
 | 
						|
+					for (int x = 0; x < width; x++) {
 | 
						|
 						bits[x].red		= *channel++;
 | 
						|
 						bits[x].green	= *channel++;
 | 
						|
 						bits[x].blue	= *channel++;
 | 
						|
@@ -296,7 +311,7 @@
 | 
						|
 				throw FI_MSG_ERROR_MEMORY;
 | 
						|
 			}
 | 
						|
 
 | 
						|
-			for (unsigned y = 0; y < height; y++) {	
 | 
						|
+			for (int y = 0; y < height; y++) {	
 | 
						|
 				float *bits = (float*)FreeImage_GetScanLine(dib, height - 1 - y);
 | 
						|
 
 | 
						|
 				if(io->read_proc(lineBuffer, sizeof(float), lineWidth, handle) != lineWidth) {
 | 
						|
@@ -305,12 +320,12 @@
 | 
						|
 				float *channel = lineBuffer;
 | 
						|
 				if(scalefactor > 0) {
 | 
						|
 					// MSB - File is Big endian
 | 
						|
-					for (unsigned x = 0; x < width; x++) {
 | 
						|
+					for (int x = 0; x < width; x++) {
 | 
						|
 						REVERSEBYTES(channel++, &bits[x]);
 | 
						|
 					}
 | 
						|
 				} else {
 | 
						|
 					// LSB - File is Little Endian
 | 
						|
-					for (unsigned x = 0; x < width; x++) {
 | 
						|
+					for (int x = 0; x < width; x++) {
 | 
						|
 						bits[x] = *channel++;
 | 
						|
 					}
 | 
						|
 				}
 | 
						|
@@ -323,9 +338,12 @@
 | 
						|
 		return dib;
 | 
						|
 
 | 
						|
 	} catch (const char *text)  {
 | 
						|
-		if(lineBuffer) free(lineBuffer);
 | 
						|
-		if(dib) FreeImage_Unload(dib);
 | 
						|
-
 | 
						|
+		if (lineBuffer) {
 | 
						|
+			free(lineBuffer);
 | 
						|
+		}
 | 
						|
+		if (dib) {
 | 
						|
+			FreeImage_Unload(dib);
 | 
						|
+		}
 | 
						|
 		if(NULL != text) {
 | 
						|
 			FreeImage_OutputMessageProc(s_format_id, text);
 | 
						|
 		}
 |