From 0ced9ef07361980d1418eab33ee1f41274d1e0e2 Mon Sep 17 00:00:00 2001 From: Mikhail Kshevetskiy Date: Tue, 20 Jan 2026 01:33:03 +0300 Subject: [PATCH 1/3] disk: part: fix partition search boundaries GPT disk partition with max available number (ex: /dev/mmcblk128) can't be read/write from U-Boot using read/write command. Here is an example: => mmc part Partition Map for mmc device 0 -- Partition Type: EFI Part Start LBA End LBA Name Attributes Type GUID Partition GUID 1 0x00001000 0x000013ff "env1" attrs: 0x0000000000000000 type: 0fc63daf-8483-4772-8e79-3d69d8477de4 guid: 5452574f-2211-4433-5566-778899aabb02 2 0x00001400 0x000017ff "env2" attrs: 0x0000000000000000 type: 0fc63daf-8483-4772-8e79-3d69d8477de4 guid: 5452574f-2211-4433-5566-778899aabb03 ................. 8 0x00158000 0x0034bfff "apps" attrs: 0x0000000000000000 type: 0fc63daf-8483-4772-8e79-3d69d8477de4 guid: 5452574f-2211-4433-5566-778899aabb09 128 0x00000420 0x00000fff "fip" attrs: 0x0000000000000000 type: c12a7328-f81f-11d2-ba4b-00a0c93ec93b guid: 5452574f-2211-4433-5566-778899aabb01 => read mmc 0#fip ${loadaddr} 0 4 Could not find "fip" partition ** Bad device specification mmc 0#fip ** ** Bad device specification mmc 0#fip ** Couldn't find partition mmc 0#fip The error is caused by invalid boundary checks. This patch fixes an issue. Fixes: 43fd4bcefd4e ("disk: part: implement generic function part_get_info_by_uuid()") Fixes: 56670d6fb83f ("disk: part: use common api to lookup part driver") Signed-off-by: Mikhail Kshevetskiy Acked-by: Quentin Schulz Reviewed-By: Michael Trimarchi --- disk/part.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/disk/part.c b/disk/part.c index 49a0fca6b89..4923dc44593 100644 --- a/disk/part.c +++ b/disk/part.c @@ -674,7 +674,7 @@ int part_get_info_by_name(struct blk_desc *desc, const char *name, if (!part_drv) return -1; - for (i = 1; i < part_drv->max_entries; i++) { + for (i = 1; i <= part_drv->max_entries; i++) { ret = part_driver_get_info(part_drv, desc, i, info); if (ret != 0) { /* -ENOSYS means no ->get_info method. */ @@ -709,7 +709,7 @@ int part_get_info_by_uuid(struct blk_desc *desc, const char *uuid, if (!part_drv) return -1; - for (i = 1; i < part_drv->max_entries; i++) { + for (i = 1; i <= part_drv->max_entries; i++) { ret = part_driver_get_info(part_drv, desc, i, info); if (ret != 0) { /* -ENOSYS means no ->get_info method. */ From 6a1f8c897375d1f673699efdb3664b96f5af8c1c Mon Sep 17 00:00:00 2001 From: Mikhail Kshevetskiy Date: Tue, 20 Jan 2026 01:33:04 +0300 Subject: [PATCH 2/3] cmd: gpt: fix partition search boundaries GPT disk partition with max available number (ex: /dev/mmcblk128) can't be used from U-Boot. Here is an example: => mmc part Partition Map for mmc device 0 -- Partition Type: EFI Part Start LBA End LBA Name Attributes Type GUID Partition GUID 1 0x00001000 0x000013ff "env1" attrs: 0x0000000000000000 type: 0fc63daf-8483-4772-8e79-3d69d8477de4 guid: 5452574f-2211-4433-5566-778899aabb02 2 0x00001400 0x000017ff "env2" attrs: 0x0000000000000000 type: 0fc63daf-8483-4772-8e79-3d69d8477de4 guid: 5452574f-2211-4433-5566-778899aabb03 ................. 8 0x00158000 0x0034bfff "apps" attrs: 0x0000000000000000 type: 0fc63daf-8483-4772-8e79-3d69d8477de4 guid: 5452574f-2211-4433-5566-778899aabb09 128 0x00000420 0x00000fff "fip" attrs: 0x0000000000000000 type: c12a7328-f81f-11d2-ba4b-00a0c93ec93b guid: 5452574f-2211-4433-5566-778899aabb01 => gpt setenv mmc 0 fip error! => gpt setenv mmc 0 apps success! The error is caused by invalid boundary checks. This patch fixes an issue. Fixes: 12fc1f3bb223 ("cmd: gpt: add eMMC and GPT support") Signed-off-by: Mikhail Kshevetskiy Acked-by: Quentin Schulz --- cmd/gpt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/gpt.c b/cmd/gpt.c index 84221881c39..205f696c807 100644 --- a/cmd/gpt.c +++ b/cmd/gpt.c @@ -723,7 +723,7 @@ static int gpt_enumerate(struct blk_desc *desc) if (part_drv->test(desc)) continue; - for (i = 1; i < part_drv->max_entries; i++) { + for (i = 1; i <= part_drv->max_entries; i++) { ret = part_driver_get_info(part_drv, desc, i, &pinfo); if (ret) continue; @@ -819,7 +819,7 @@ static int gpt_setenv(struct blk_desc *desc, const char *name) struct disk_partition pinfo; int i; - for (i = 1; i < part_drv->max_entries; i++) { + for (i = 1; i <= part_drv->max_entries; i++) { ret = part_driver_get_info(part_drv, desc, i, &pinfo); if (ret) continue; From b06a1785b2bbe489a634e3158f82f93491a84328 Mon Sep 17 00:00:00 2001 From: Mikhail Kshevetskiy Date: Tue, 20 Jan 2026 01:33:05 +0300 Subject: [PATCH 3/3] mtd: mtdpart: fix partitions searching mtdpart internally enumerate partitions starting from zero, but partition driver API enumerate partitions starting from 1, so wrong partition will be queried. This is wrong. Unnecessary debug message also was removed. Fixes: c29a6daec184 ("disk: support MTD partitions") Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/mtdpart.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index 842d3e7274e..f3b7f1ee13c 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c @@ -1061,13 +1061,13 @@ EXPORT_SYMBOL_GPL(mtd_get_device_size); static struct mtd_info *mtd_get_partition_by_index(struct mtd_info *mtd, int index) { struct mtd_info *part; - int i = 0; + int i = 1; + /* partition indexes starts from 1 */ list_for_each_entry(part, &mtd->partitions, node) if (i++ == index) return part; - debug("Partition with idx=%d not found on MTD device %s\n", index, mtd->name); return NULL; } @@ -1084,7 +1084,8 @@ static int __maybe_unused part_get_info_mtd(struct blk_desc *dev_desc, int part_ part = mtd_get_partition_by_index(master, part_idx); if (!part) { - debug("Failed to find partition with idx=%d\n", part_idx); + debug("Failed to find partition with idx=%d on MTD device %s\n", + part_idx, master->name); return -EINVAL; }