3d071d
From 24f5385f4a54b90f4b7674e23f30567591962bcb Mon Sep 17 00:00:00 2001
3d071d
From: Samanta Navarro <ferivoz@riseup.net>
3d071d
Date: Tue, 10 Nov 2020 11:48:04 +0100
3d071d
Subject: libblkid: limit amount of parsed partitions
3d071d
3d071d
The linux kernel does not support more than 256 partitions
3d071d
(DISK_MAX_PARTS). The atari and mac block devices have no such limits.
3d071d
3d071d
Use dos logical partition limit for atari as well (100).
3d071d
Use the kernel limit for mac (256).
3d071d
3d071d
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2060030
3d071d
Upstream: http://github.com/util-linux/util-linux/commit/c70b4f2a5b99876d230b8f4f413c3bb3ee6647f1
3d071d
Signed-off-by: Karel Zak <kzak@redhat.com>
3d071d
Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
3d071d
---
3d071d
 libblkid/src/partitions/atari.c |  6 +++++-
3d071d
 libblkid/src/partitions/mac.c   | 15 +++++++++++----
3d071d
 2 files changed, 16 insertions(+), 5 deletions(-)
3d071d
3d071d
diff --git a/libblkid/src/partitions/atari.c b/libblkid/src/partitions/atari.c
3d071d
index c3f77117a..fdd5498b5 100644
3d071d
--- a/libblkid/src/partitions/atari.c
3d071d
+++ b/libblkid/src/partitions/atari.c
3d071d
@@ -141,12 +141,16 @@ static int parse_extended(blkid_probe pr, blkid_partlist ls,
3d071d
 	blkid_parttable tab, struct atari_part_def *part)
3d071d
 {
3d071d
 	uint32_t x0start, xstart;
3d071d
-	unsigned i = 0;
3d071d
+	unsigned ct = 0, i = 0;
3d071d
 	int rc;
3d071d
 
3d071d
 	x0start = xstart = be32_to_cpu(part->start);
3d071d
 	while (1) {
3d071d
 		struct atari_rootsector *xrs;
3d071d
+
3d071d
+		if (++ct > 100)
3d071d
+			break;
3d071d
+
3d071d
 		xrs = (struct atari_rootsector *) blkid_probe_get_sector(pr, xstart);
3d071d
 		if (!xrs) {
3d071d
 			if (errno)
3d071d
diff --git a/libblkid/src/partitions/mac.c b/libblkid/src/partitions/mac.c
3d071d
index 2be91a620..092d31d32 100644
3d071d
--- a/libblkid/src/partitions/mac.c
3d071d
+++ b/libblkid/src/partitions/mac.c
3d071d
@@ -79,7 +79,7 @@ static int probe_mac_pt(blkid_probe pr,
3d071d
 	blkid_partlist ls;
3d071d
 	uint16_t block_size;
3d071d
 	uint16_t ssf;	/* sector size fragment */
3d071d
-	uint32_t nblks, i;
3d071d
+	uint32_t nblks, nprts, i;
3d071d
 
3d071d
 
3d071d
 	/* The driver descriptor record is always located at physical block 0,
3d071d
@@ -122,8 +122,15 @@ static int probe_mac_pt(blkid_probe pr,
3d071d
 
3d071d
 	ssf = block_size / 512;
3d071d
 	nblks = be32_to_cpu(p->map_count);
3d071d
-
3d071d
-	for (i = 0; i < nblks; ++i) {
3d071d
+	if (nblks > 256) {
3d071d
+		nprts = 256;
3d071d
+		DBG(LOWPROBE, ul_debug(
3d071d
+			"mac: map_count too large, entry[0]: %u, "
3d071d
+			"enforcing limit of %u", nblks, nprts));
3d071d
+	} else
3d071d
+		nprts = nblks;
3d071d
+
3d071d
+	for (i = 0; i < nprts; ++i) {
3d071d
 		blkid_partition par;
3d071d
 		uint32_t start;
3d071d
 		uint32_t size;
3d071d
@@ -140,7 +147,7 @@ static int probe_mac_pt(blkid_probe pr,
3d071d
 		if (be32_to_cpu(p->map_count) != nblks) {
3d071d
 			DBG(LOWPROBE, ul_debug(
3d071d
 				"mac: inconsistent map_count in partition map, "
3d071d
-				"entry[0]: %d, entry[%d]: %d",
3d071d
+				"entry[0]: %u, entry[%u]: %u",
3d071d
 				nblks, i,
3d071d
 				be32_to_cpu(p->map_count)));
3d071d
 		}
3d071d
-- 
3d071d
2.36.1
3d071d