File util-linux-libblkid-overflow.patch of Package util-linux.openSUSE_13.1_Update

Index: util-linux-2.23.2/libblkid/src/partitions/gpt.c
===================================================================
--- util-linux-2.23.2.orig/libblkid/src/partitions/gpt.c
+++ util-linux-2.23.2/libblkid/src/partitions/gpt.c
@@ -17,6 +17,7 @@
 #include <stdlib.h>
 #include <stdint.h>
 #include <stddef.h>
+#include <limits.h>
 
 #include "partitions.h"
 #include "crc32.h"
@@ -259,14 +260,17 @@ static struct gpt_header *get_gpt_header
 		return NULL;
 	}
 
-	/* Size of blocks with GPT entries */
-	esz = le32_to_cpu(h->num_partition_entries) *
-			le32_to_cpu(h->sizeof_partition_entry);
-	if (!esz) {
+	if (le32_to_cpu(h->num_partition_entries) == 0 ||
+	    le32_to_cpu(h->sizeof_partition_entry) == 0 ||
+	    ULONG_MAX/le32_to_cpu(h->num_partition_entries) < le32_to_cpu(h->sizeof_partition_entry)) {
 		DBG(LOWPROBE, blkid_debug("GPT entries undefined"));
 		return NULL;
 	}
 
+	/* Size of blocks with GPT entries */
+	esz = le32_to_cpu(h->num_partition_entries) *
+			le32_to_cpu(h->sizeof_partition_entry);
+
 	/* The header seems valid, save it
 	 * (we don't care about zeros in hdr->reserved2 area) */
 	memcpy(hdr, h, sizeof(*h));
Index: util-linux-2.23.2/libblkid/src/probe.c
===================================================================
--- util-linux-2.23.2.orig/libblkid/src/probe.c
+++ util-linux-2.23.2/libblkid/src/probe.c
@@ -103,6 +103,7 @@
 #include <inttypes.h>
 #include <stdint.h>
 #include <stdarg.h>
+#include <limits.h>
 
 #ifdef HAVE_LIBUUID
 # include <uuid.h>
@@ -562,6 +563,12 @@ unsigned char *blkid_probe_get_buffer(bl
 		if (blkid_llseek(pr->fd, pr->off + off, SEEK_SET) < 0)
 			return NULL;
 
+		/* someone trying to overflow some buffers? */
+		if (len >= ULONG_MAX - sizeof(struct blkid_bufinfo)) {
+			errno = ENOMEM;
+			return NULL;
+		}
+
 		/* allocate info and space for data by why call */
 		bf = calloc(1, sizeof(struct blkid_bufinfo) + len);
 		if (!bf)
Index: util-linux-2.23.2/libblkid/src/superblocks/zfs.c
===================================================================
--- util-linux-2.23.2.orig/libblkid/src/superblocks/zfs.c
+++ util-linux-2.23.2/libblkid/src/superblocks/zfs.c
@@ -12,6 +12,7 @@
 #include <errno.h>
 #include <ctype.h>
 #include <inttypes.h>
+#include <limits.h>
 
 #include "superblocks.h"
 
@@ -108,6 +109,8 @@ static void zfs_extract_guid_name(blkid_
 
 			nvs->nvs_type = be32_to_cpu(nvs->nvs_type);
 			nvs->nvs_strlen = be32_to_cpu(nvs->nvs_strlen);
+			if (nvs->nvs_strlen >= UINT_MAX - sizeof(*nvs))
+				break;
 			avail -= nvs->nvs_strlen + sizeof(*nvs);
 			nvdebug("nvstring: type %u string %*s\n", nvs->nvs_type,
 				nvs->nvs_strlen, nvs->nvs_string);
openSUSE Build Service is sponsored by