[PATCH 4/4] boot: bootflow_menu: fix crash for EFI BOOTMGR global bootmeth

Quentin Schulz foss+uboot at 0leil.net
Wed Jun 12 16:58:49 CEST 2024


From: Quentin Schulz <quentin.schulz at cherry.de>

The global bootmeths don't set the dev in bootflow struct which means
the dev_get_parent(bflow->dev) triggers a NULL-pointer dereference and
crash U-Boot.

So before trying to handle a bootflow, check that the associated
bootmeth isn't global, otherwise skip it.

Suggested-by: Simon Glass <sjg at chromium.org>
Signed-off-by: Quentin Schulz <quentin.schulz at cherry.de>
---
 boot/bootflow_menu.c | 7 +++++++
 include/bootflow.h   | 3 ++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c
index 16f9cd8f8ca..70f1f728b72 100644
--- a/boot/bootflow_menu.c
+++ b/boot/bootflow_menu.c
@@ -10,6 +10,7 @@
 
 #include <common.h>
 #include <bootflow.h>
+#include <bootmeth.h>
 #include <bootstd.h>
 #include <cli.h>
 #include <dm.h>
@@ -77,6 +78,7 @@ int bootflow_menu_new(struct expo **expp)
 	last_bootdev = NULL;
 	for (ret = bootflow_first_glob(&bflow), i = 0; !ret && i < 36;
 	     ret = bootflow_next_glob(&bflow), i++) {
+		struct bootmeth_uc_plat *ucp;
 		char str[2], *label, *key;
 		uint preview_id;
 		bool add_gap;
@@ -84,6 +86,11 @@ int bootflow_menu_new(struct expo **expp)
 		if (bflow->state != BOOTFLOWST_READY)
 			continue;
 
+		/* No media to show for BOOTMETHF_GLOBAL bootmeths */
+		ucp = dev_get_uclass_plat(bflow->method);
+		if (ucp->flags & BOOTMETHF_GLOBAL)
+			continue;
+
 		*str = i < 10 ? '0' + i : 'A' + i - 10;
 		str[1] = '\0';
 		key = strdup(str);
diff --git a/include/bootflow.h b/include/bootflow.h
index 080ee850122..6affc5e1a4f 100644
--- a/include/bootflow.h
+++ b/include/bootflow.h
@@ -63,7 +63,8 @@ enum bootflow_flags_t {
  *
  * @bm_node: Points to siblings in the same bootdev
  * @glob_node: Points to siblings in the global list (all bootdev)
- * @dev: Bootdev device which produced this bootflow
+ * @dev: Bootdev device which produced this bootflow, NULL for flows created by
+ *      BOOTMETHF_GLOBAL bootmeths
  * @blk: Block device which contains this bootflow, NULL if this is a network
  *	device or sandbox 'host' device
  * @part: Partition number (0 for whole device)

-- 
2.45.2



More information about the U-Boot mailing list