summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <[email protected]>2025-03-15 14:25:59 +0000
committerTom Rini <[email protected]>2025-04-03 11:43:22 -0600
commit199648bac156daaaad1c66c52dcd33250a272e69 (patch)
treea940eb331fac2c38417da848319482194f1aeba4
parent6acb0d28b06c408740e8b80e4015e1e656c7faf4 (diff)
boot: Handle running out of labels
If only a single label is provided in the list, bootdev_next_label() does not operate correctly and reads beyond the end of the pointer list. Fix this by adding a new check. Also add a note to convert this array to an alist Signed-off-by: Simon Glass <[email protected]>
-rw-r--r--boot/bootdev-uclass.c3
-rw-r--r--include/bootstd.h3
2 files changed, 6 insertions, 0 deletions
diff --git a/boot/bootdev-uclass.c b/boot/bootdev-uclass.c
index 9e4c3db2dc1..3791ebfcb42 100644
--- a/boot/bootdev-uclass.c
+++ b/boot/bootdev-uclass.c
@@ -579,6 +579,9 @@ int bootdev_next_label(struct bootflow_iter *iter, struct udevice **devp,
struct udevice *dev;
log_debug("next\n");
+ if (iter->cur_label >= 0 && !iter->labels[iter->cur_label])
+ return log_msg_ret("fil", -ENODEV);
+
for (dev = NULL; !dev && iter->labels[++iter->cur_label];) {
const char *label = iter->labels[iter->cur_label];
int ret;
diff --git a/include/bootstd.h b/include/bootstd.h
index 3398e48e88b..2bc464756dd 100644
--- a/include/bootstd.h
+++ b/include/bootstd.h
@@ -22,6 +22,9 @@ struct udevice;
* This is attached to the (only) bootstd device, so there is only one instance
* of this struct. It provides overall information about bootdevs and bootflows.
*
+ * TODO([email protected]): Convert prefixes, bootdev_order and env_order to use
+ * alist
+ *
* @prefixes: NULL-terminated list of prefixes to use for bootflow filenames,
* e.g. "/", "/boot/"; NULL if none
* @bootdev_order: Order to use for bootdevs (or NULL if none), with each item