From: Michael Schmitz <schmitzmic@gmail.com>
To: gregkh@linuxfoundation.org, Martin@lichtvoll.de, axboe@kernel.dk,
geert@linux-m68k.org, hch@infradead.org, jdow@earthlink.net,
stable@vger.kernel.org
Subject: Re: FAILED: patch "[PATCH] block: add overflow checks for Amiga partition support" failed to apply to 5.10-stable tree
Date: Wed, 12 Jul 2023 08:45:27 +1200 [thread overview]
Message-ID: <357b640e-5d24-7779-f4a6-d704bd623934@gmail.com> (raw)
In-Reply-To: <2023071116-umbrella-fog-a65f@gregkh>
Hi Greg,
this patch was part of a series of three patches
(fc3d092c6bb48d5865fec15ed5b333c12f36288c,
95a55437dc49fb3342c82e61f5472a71c63d9ed0,
b6f3f28f604ba3de4724ad82bea6adb1300c0b5f). The first in that series must
also be cherry-picked in order for the third one to apply cleanly.
You appear to have applied fc3d092c6bb48d5865fec15ed5b333c12f36288c to
5.4 and 5.10 now, so I'd expect re-applying
b6f3f28f604ba3de4724ad82bea6adb1300c0b5f would work OK>
Please note that after these have all been applied, we still need
7eb1e47696aa231b1a567846bbe3a1e1befe1854 ("block/partition: fix
signedness issue for Amiga partitions") which is a bugfix for
b6f3f28f604ba3de4724ad82bea6adb1300c0b5f.
Thanks!
Cheers,
Michael
On 12/07/23 08:30, gregkh@linuxfoundation.org wrote:
> The patch below does not apply to the 5.10-stable tree.
> If someone wants it applied there, or to any other stable or longterm
> tree, then please email the backport, including the original git commit
> id to <stable@vger.kernel.org>.
>
> To reproduce the conflict and resubmit, you may use the following commands:
>
> git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.10.y
> git checkout FETCH_HEAD
> git cherry-pick -x b6f3f28f604ba3de4724ad82bea6adb1300c0b5f
> # <resolve conflicts, build, test, etc.>
> git commit -s
> git send-email --to '<stable@vger.kernel.org>' --in-reply-to '2023071116-umbrella-fog-a65f@gregkh' --subject-prefix 'PATCH 5.10.y' HEAD^..
>
> Possible dependencies:
>
>
>
> thanks,
>
> greg k-h
>
> ------------------ original commit in Linus's tree ------------------
>
> From b6f3f28f604ba3de4724ad82bea6adb1300c0b5f Mon Sep 17 00:00:00 2001
> From: Michael Schmitz <schmitzmic@gmail.com>
> Date: Wed, 21 Jun 2023 08:17:25 +1200
> Subject: [PATCH] block: add overflow checks for Amiga partition support
>
> The Amiga partition parser module uses signed int for partition sector
> address and count, which will overflow for disks larger than 1 TB.
>
> Use u64 as type for sector address and size to allow using disks up to
> 2 TB without LBD support, and disks larger than 2 TB with LBD. The RBD
> format allows to specify disk sizes up to 2^128 bytes (though native
> OS limitations reduce this somewhat, to max 2^68 bytes), so check for
> u64 overflow carefully to protect against overflowing sector_t.
>
> Bail out if sector addresses overflow 32 bits on kernels without LBD
> support.
>
> This bug was reported originally in 2012, and the fix was created by
> the RDB author, Joanne Dow <jdow@earthlink.net>. A patch had been
> discussed and reviewed on linux-m68k at that time but never officially
> submitted (now resubmitted as patch 1 in this series).
> This patch adds additional error checking and warning messages.
>
> Reported-by: Martin Steigerwald <Martin@lichtvoll.de>
> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=43511
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Message-ID: <201206192146.09327.Martin@lichtvoll.de>
> Cc: <stable@vger.kernel.org> # 5.2
> Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
> Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
> Reviewed-by: Christoph Hellwig <hch@infradead.org>
> Link: https://lore.kernel.org/r/20230620201725.7020-4-schmitzmic@gmail.com
> Signed-off-by: Jens Axboe <axboe@kernel.dk>
>
> diff --git a/block/partitions/amiga.c b/block/partitions/amiga.c
> index 85c5c79aae48..ed222b9c901b 100644
> --- a/block/partitions/amiga.c
> +++ b/block/partitions/amiga.c
> @@ -11,10 +11,18 @@
> #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)
> {
> @@ -31,9 +39,12 @@ int amiga_partition(struct parsed_partitions *state)
> unsigned char *data;
> struct RigidDiskBlock *rdb;
> struct PartitionBlock *pb;
> - sector_t start_sect, nr_sects;
> - int blk, part, res = 0;
> - int blksize = 1; /* Multiplier for disk block size */
> + 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 slot = 1;
>
> for (blk = 0; ; blk++, put_dev_sector(sect)) {
> @@ -41,7 +52,7 @@ int amiga_partition(struct parsed_partitions *state)
> goto rdb_done;
> data = read_part_sector(state, blk, §);
> if (!data) {
> - pr_err("Dev %s: unable to read RDB block %d\n",
> + pr_err("Dev %s: unable to read RDB block %llu\n",
> state->disk->disk_name, blk);
> res = -1;
> goto rdb_done;
> @@ -58,12 +69,12 @@ int amiga_partition(struct parsed_partitions *state)
> *(__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 %d ignored in checksum calculation\n",
> + pr_err("Trashed word at 0xd0 in block %llu ignored in checksum calculation\n",
> blk);
> break;
> }
>
> - pr_err("Dev %s: RDB in block %d has bad checksum\n",
> + pr_err("Dev %s: RDB in block %llu has bad checksum\n",
> state->disk->disk_name, blk);
> }
>
> @@ -80,10 +91,15 @@ int amiga_partition(struct parsed_partitions *state)
> blk = be32_to_cpu(rdb->rdb_PartitionList);
> put_dev_sector(sect);
> for (part = 1; blk>0 && part<=16; part++, put_dev_sector(sect)) {
> - blk *= blksize; /* Read in terms partition table understands */
> + /* 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;
> + }
> data = read_part_sector(state, blk, §);
> if (!data) {
> - pr_err("Dev %s: unable to read partition block %d\n",
> + pr_err("Dev %s: unable to read partition block %llu\n",
> state->disk->disk_name, blk);
> res = -1;
> goto rdb_done;
> @@ -95,19 +111,70 @@ int amiga_partition(struct parsed_partitions *state)
> if (checksum_block((__be32 *)pb, be32_to_cpu(pb->pb_SummedLongs) & 0x7F) != 0 )
> continue;
>
> - /* Tell Kernel about it */
> + /* 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);
>
> - nr_sects = ((sector_t)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;
> - start_sect = (sector_t)be32_to_cpu(pb->pb_Environment[9]) *
> - be32_to_cpu(pb->pb_Environment[3]) *
> - be32_to_cpu(pb->pb_Environment[5]) *
> - blksize;
> +
> + /* 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 */
> +
> put_partition(state,slot++,start_sect,nr_sects);
> {
> /* Be even more informative to aid mounting */
>
next prev parent reply other threads:[~2023-07-11 20:46 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-11 20:30 FAILED: patch "[PATCH] block: add overflow checks for Amiga partition support" failed to apply to 5.10-stable tree gregkh
2023-07-11 20:45 ` Michael Schmitz [this message]
2023-07-15 2:10 ` Michael Schmitz
2023-07-15 23:28 ` [PATCH 5.10.y] block: add overflow checks for Amiga partition support Michael Schmitz
2023-07-16 15:21 ` Greg KH
2023-07-16 19:58 ` Michael Schmitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=357b640e-5d24-7779-f4a6-d704bd623934@gmail.com \
--to=schmitzmic@gmail.com \
--cc=Martin@lichtvoll.de \
--cc=axboe@kernel.dk \
--cc=geert@linux-m68k.org \
--cc=gregkh@linuxfoundation.org \
--cc=hch@infradead.org \
--cc=jdow@earthlink.net \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox