Blob Blame History Raw
From 24f5385f4a54b90f4b7674e23f30567591962bcb Mon Sep 17 00:00:00 2001
From: Samanta Navarro <ferivoz@riseup.net>
Date: Tue, 10 Nov 2020 11:48:04 +0100
Subject: libblkid: limit amount of parsed partitions

The linux kernel does not support more than 256 partitions
(DISK_MAX_PARTS). The atari and mac block devices have no such limits.

Use dos logical partition limit for atari as well (100).
Use the kernel limit for mac (256).

Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2060030
Upstream: http://github.com/util-linux/util-linux/commit/c70b4f2a5b99876d230b8f4f413c3bb3ee6647f1
Signed-off-by: Karel Zak <kzak@redhat.com>
Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
---
 libblkid/src/partitions/atari.c |  6 +++++-
 libblkid/src/partitions/mac.c   | 15 +++++++++++----
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/libblkid/src/partitions/atari.c b/libblkid/src/partitions/atari.c
index c3f77117a..fdd5498b5 100644
--- a/libblkid/src/partitions/atari.c
+++ b/libblkid/src/partitions/atari.c
@@ -141,12 +141,16 @@ static int parse_extended(blkid_probe pr, blkid_partlist ls,
 	blkid_parttable tab, struct atari_part_def *part)
 {
 	uint32_t x0start, xstart;
-	unsigned i = 0;
+	unsigned ct = 0, i = 0;
 	int rc;
 
 	x0start = xstart = be32_to_cpu(part->start);
 	while (1) {
 		struct atari_rootsector *xrs;
+
+		if (++ct > 100)
+			break;
+
 		xrs = (struct atari_rootsector *) blkid_probe_get_sector(pr, xstart);
 		if (!xrs) {
 			if (errno)
diff --git a/libblkid/src/partitions/mac.c b/libblkid/src/partitions/mac.c
index 2be91a620..092d31d32 100644
--- a/libblkid/src/partitions/mac.c
+++ b/libblkid/src/partitions/mac.c
@@ -79,7 +79,7 @@ static int probe_mac_pt(blkid_probe pr,
 	blkid_partlist ls;
 	uint16_t block_size;
 	uint16_t ssf;	/* sector size fragment */
-	uint32_t nblks, i;
+	uint32_t nblks, nprts, i;
 
 
 	/* The driver descriptor record is always located at physical block 0,
@@ -122,8 +122,15 @@ static int probe_mac_pt(blkid_probe pr,
 
 	ssf = block_size / 512;
 	nblks = be32_to_cpu(p->map_count);
-
-	for (i = 0; i < nblks; ++i) {
+	if (nblks > 256) {
+		nprts = 256;
+		DBG(LOWPROBE, ul_debug(
+			"mac: map_count too large, entry[0]: %u, "
+			"enforcing limit of %u", nblks, nprts));
+	} else
+		nprts = nblks;
+
+	for (i = 0; i < nprts; ++i) {
 		blkid_partition par;
 		uint32_t start;
 		uint32_t size;
@@ -140,7 +147,7 @@ static int probe_mac_pt(blkid_probe pr,
 		if (be32_to_cpu(p->map_count) != nblks) {
 			DBG(LOWPROBE, ul_debug(
 				"mac: inconsistent map_count in partition map, "
-				"entry[0]: %d, entry[%d]: %d",
+				"entry[0]: %u, entry[%u]: %u",
 				nblks, i,
 				be32_to_cpu(p->map_count)));
 		}
-- 
2.36.1