From: Quentin Schulz Date: Wed, 12 Jun 2024 14:58:49 +0000 (+0200) Subject: boot: bootflow_menu: fix crash for EFI BOOTMGR global bootmeth X-Git-Url: http://git.dujemihanovic.xyz/?a=commitdiff_plain;h=05b9665f095f2f70bf8de7ea6d1f5efc2ce7fb35;p=u-boot.git boot: bootflow_menu: fix crash for EFI BOOTMGR global bootmeth 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 Signed-off-by: Quentin Schulz Reviewed-by: Simon Glass --- diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c index 143ef84133..9d0dc352f9 100644 --- a/boot/bootflow_menu.c +++ b/boot/bootflow_menu.c @@ -9,6 +9,7 @@ #define LOG_CATEGORY UCLASS_BOOTSTD #include +#include #include #include #include @@ -76,6 +77,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; @@ -83,6 +85,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 080ee85012..6affc5e1a4 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)