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 <s...@chromium.org>
---

(no changes since v3)

Changes in v3:
- Add new patch to handle running out of labels

 boot/bootdev-uclass.c | 3 +++
 include/bootstd.h     | 3 +++
 2 files changed, 6 insertions(+)

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 c39058c0787..ac3c1922fcc 100644
--- a/include/bootstd.h
+++ b/include/bootstd.h
@@ -24,6 +24,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(s...@chromium.org): 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
-- 
2.43.0

Reply via email to