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 <sjg@chromium.org> Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -9,6 +9,7 @@
|
|||||||
#define LOG_CATEGORY UCLASS_BOOTSTD
|
#define LOG_CATEGORY UCLASS_BOOTSTD
|
||||||
|
|
||||||
#include <bootflow.h>
|
#include <bootflow.h>
|
||||||
|
#include <bootmeth.h>
|
||||||
#include <bootstd.h>
|
#include <bootstd.h>
|
||||||
#include <cli.h>
|
#include <cli.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
@@ -76,6 +77,7 @@ int bootflow_menu_new(struct expo **expp)
|
|||||||
last_bootdev = NULL;
|
last_bootdev = NULL;
|
||||||
for (ret = bootflow_first_glob(&bflow), i = 0; !ret && i < 36;
|
for (ret = bootflow_first_glob(&bflow), i = 0; !ret && i < 36;
|
||||||
ret = bootflow_next_glob(&bflow), i++) {
|
ret = bootflow_next_glob(&bflow), i++) {
|
||||||
|
struct bootmeth_uc_plat *ucp;
|
||||||
char str[2], *label, *key;
|
char str[2], *label, *key;
|
||||||
uint preview_id;
|
uint preview_id;
|
||||||
bool add_gap;
|
bool add_gap;
|
||||||
@@ -83,6 +85,11 @@ int bootflow_menu_new(struct expo **expp)
|
|||||||
if (bflow->state != BOOTFLOWST_READY)
|
if (bflow->state != BOOTFLOWST_READY)
|
||||||
continue;
|
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 = i < 10 ? '0' + i : 'A' + i - 10;
|
||||||
str[1] = '\0';
|
str[1] = '\0';
|
||||||
key = strdup(str);
|
key = strdup(str);
|
||||||
|
@@ -63,7 +63,8 @@ enum bootflow_flags_t {
|
|||||||
*
|
*
|
||||||
* @bm_node: Points to siblings in the same bootdev
|
* @bm_node: Points to siblings in the same bootdev
|
||||||
* @glob_node: Points to siblings in the global list (all 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
|
* @blk: Block device which contains this bootflow, NULL if this is a network
|
||||||
* device or sandbox 'host' device
|
* device or sandbox 'host' device
|
||||||
* @part: Partition number (0 for whole device)
|
* @part: Partition number (0 for whole device)
|
||||||
|
Reference in New Issue
Block a user