Code: Select all
diff -rupN a/block/partitions/amiga.c b/block/partitions/amiga.c > revert_amiga.c.patchCode: Select all
--- a/block/partitions/amiga.c	2023-06-29 04:29:22.947100347 +0200
+++ b/block/partitions/amiga.c	2023-06-26 01:29:58.000000000 +0200
@@ -11,18 +11,10 @@
 #define pr_fmt(fmt) fmt
 
 #include <linux/types.h>
-#include <linux/mm_types.h>
-#include <linux/overflow.h>
 #include <linux/affs_hardblocks.h>
 
 #include "check.h"
 
-/* magic offsets in partition DosEnvVec */
-#define NR_HD	3
-#define NR_SECT	5
-#define LO_CYL	9
-#define HI_CYL	10
-
 static __inline__ u32
 checksum_block(__be32 *m, int size)
 {
@@ -39,12 +31,8 @@ int amiga_partition(struct parsed_partit
 	unsigned char *data;
 	struct RigidDiskBlock *rdb;
 	struct PartitionBlock *pb;
-	u64 start_sect, nr_sects;
-	sector_t blk, end_sect;
-	u32 cylblk;		/* rdb_CylBlocks = nr_heads*sect_per_track */
-	u32 nr_hd, nr_sect, lo_cyl, hi_cyl;
-	int part, res = 0;
-	unsigned int blksize = 1;	/* Multiplier for disk block size */
+	int start_sect, nr_sects, blk, part, res = 0;
+	int blksize = 1;	/* Multiplier for disk block size */
 	int slot = 1;
 
 	for (blk = 0; ; blk++, put_dev_sector(sect)) {
@@ -52,7 +40,7 @@ int amiga_partition(struct parsed_partit
 			goto rdb_done;
 		data = read_part_sector(state, blk, §);
 		if (!data) {
-			pr_err("Dev %s: unable to read RDB block %llu\n",
+			pr_err("Dev %s: unable to read RDB block %d\n",
 			       state->disk->disk_name, blk);
 			res = -1;
 			goto rdb_done;
@@ -69,12 +57,12 @@ int amiga_partition(struct parsed_partit
 		*(__be32 *)(data+0xdc) = 0;
 		if (checksum_block((__be32 *)data,
 				be32_to_cpu(rdb->rdb_SummedLongs) & 0x7F)==0) {
-			pr_err("Trashed word at 0xd0 in block %llu ignored in checksum calculation\n",
+			pr_err("Trashed word at 0xd0 in block %d ignored in checksum calculation\n",
 			       blk);
 			break;
 		}
 
-		pr_err("Dev %s: RDB in block %llu has bad checksum\n",
+		pr_err("Dev %s: RDB in block %d has bad checksum\n",
 		       state->disk->disk_name, blk);
 	}
 
@@ -91,15 +79,10 @@ int amiga_partition(struct parsed_partit
 	blk = be32_to_cpu(rdb->rdb_PartitionList);
 	put_dev_sector(sect);
 	for (part = 1; blk>0 && part<=16; part++, put_dev_sector(sect)) {
-		/* Read in terms partition table understands */
-		if (check_mul_overflow(blk, (sector_t) blksize, &blk)) {
-			pr_err("Dev %s: overflow calculating partition block %llu! Skipping partitions %u and beyond\n",
-				state->disk->disk_name, blk, part);
-			break;
-		}
+		blk *= blksize;	/* Read in terms partition table understands */
 		data = read_part_sector(state, blk, §);
 		if (!data) {
-			pr_err("Dev %s: unable to read partition block %llu\n",
+			pr_err("Dev %s: unable to read partition block %d\n",
 			       state->disk->disk_name, blk);
 			res = -1;
 			goto rdb_done;
@@ -111,70 +94,19 @@ int amiga_partition(struct parsed_partit
 		if (checksum_block((__be32 *)pb, be32_to_cpu(pb->pb_SummedLongs) & 0x7F) != 0 )
 			continue;
 
-		/* RDB gives us more than enough rope to hang ourselves with,
-		 * many times over (2^128 bytes if all fields max out).
-		 * Some careful checks are in order, so check for potential
-		 * overflows.
-		 * We are multiplying four 32 bit numbers to one sector_t!
-		 */
-
-		nr_hd   = be32_to_cpu(pb->pb_Environment[NR_HD]);
-		nr_sect = be32_to_cpu(pb->pb_Environment[NR_SECT]);
-
-		/* CylBlocks is total number of blocks per cylinder */
-		if (check_mul_overflow(nr_hd, nr_sect, &cylblk)) {
-			pr_err("Dev %s: heads*sects %u overflows u32, skipping partition!\n",
-				state->disk->disk_name, cylblk);
-			continue;
-		}
-
-		/* check for consistency with RDB defined CylBlocks */
-		if (cylblk > be32_to_cpu(rdb->rdb_CylBlocks)) {
-			pr_warn("Dev %s: cylblk %u > rdb_CylBlocks %u!\n",
-				state->disk->disk_name, cylblk,
-				be32_to_cpu(rdb->rdb_CylBlocks));
-		}
-
-		/* RDB allows for variable logical block size -
-		 * normalize to 512 byte blocks and check result.
-		 */
-
-		if (check_mul_overflow(cylblk, blksize, &cylblk)) {
-			pr_err("Dev %s: partition %u bytes per cyl. overflows u32, skipping partition!\n",
-				state->disk->disk_name, part);
-			continue;
-		}
-
-		/* Calculate partition start and end. Limit of 32 bit on cylblk
-		 * guarantees no overflow occurs if LBD support is enabled.
-		 */
-
-		lo_cyl = be32_to_cpu(pb->pb_Environment[LO_CYL]);
-		start_sect = ((u64) lo_cyl * cylblk);
-
-		hi_cyl = be32_to_cpu(pb->pb_Environment[HI_CYL]);
-		nr_sects = (((u64) hi_cyl - lo_cyl + 1) * cylblk);
+		/* Tell Kernel about it */
 
+		nr_sects = (be32_to_cpu(pb->pb_Environment[10]) + 1 -
+			    be32_to_cpu(pb->pb_Environment[9])) *
+			   be32_to_cpu(pb->pb_Environment[3]) *
+			   be32_to_cpu(pb->pb_Environment[5]) *
+			   blksize;
 		if (!nr_sects)
 			continue;
-
-		/* Warn user if partition end overflows u32 (AmigaDOS limit) */
-
-		if ((start_sect + nr_sects) > UINT_MAX) {
-			pr_warn("Dev %s: partition %u (%llu-%llu) needs 64 bit device support!\n",
-				state->disk->disk_name, part,
-				start_sect, start_sect + nr_sects);
-		}
-
-		if (check_add_overflow(start_sect, nr_sects, &end_sect)) {
-			pr_err("Dev %s: partition %u (%llu-%llu) needs LBD device support, skipping partition!\n",
-				state->disk->disk_name, part,
-				start_sect, end_sect);
-			continue;
-		}
-
-		/* Tell Kernel about it */
-
+		start_sect = be32_to_cpu(pb->pb_Environment[9]) *
+			     be32_to_cpu(pb->pb_Environment[3]) *
+			     be32_to_cpu(pb->pb_Environment[5]) *
+			     blksize;
 		put_partition(state,slot++,start_sect,nr_sects);
 		{
 			/* Be even more informative to aid mounting */





