summaryrefslogtreecommitdiff
path: root/boot/bootmeth_rauc.c
diff options
context:
space:
mode:
Diffstat (limited to 'boot/bootmeth_rauc.c')
-rw-r--r--boot/bootmeth_rauc.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/boot/bootmeth_rauc.c b/boot/bootmeth_rauc.c
index fc60e6e355d..cc6180221ed 100644
--- a/boot/bootmeth_rauc.c
+++ b/boot/bootmeth_rauc.c
@@ -79,18 +79,17 @@ static int distro_rauc_check(struct udevice *dev, struct bootflow_iter *iter)
return 0;
}
-static int distro_rauc_scan_boot_part(struct bootflow *bflow)
+static int distro_rauc_scan_parts(struct bootflow *bflow)
{
struct blk_desc *desc;
struct distro_rauc_priv *priv;
char *boot_order;
const char **boot_order_list;
- bool exists;
int ret;
int i;
- int j;
- desc = dev_get_uclass_plat(bflow->blk);
+ if (bflow->blk)
+ desc = dev_get_uclass_plat(bflow->blk);
priv = bflow->bootmeth_priv;
if (!priv || !priv->slots)
@@ -99,20 +98,21 @@ static int distro_rauc_scan_boot_part(struct bootflow *bflow)
boot_order = env_get("BOOT_ORDER");
boot_order_list = str_to_list(boot_order);
for (i = 0; boot_order_list[i]; i++) {
- exists = false;
- for (j = 0; script_names[j]; j++) {
- const struct distro_rauc_slot *slot;
+ const struct distro_rauc_slot *slot;
- slot = get_slot(priv, boot_order_list[i]);
- if (!slot)
- return log_msg_ret("env", -ENOENT);
+ slot = get_slot(priv, boot_order_list[i]);
+ if (!slot)
+ return log_msg_ret("slot", -EINVAL);
+ if (desc) {
ret = fs_set_blk_dev_with_part(desc, slot->boot_part);
if (ret)
- return log_msg_ret("blk", ret);
- exists |= fs_exists(script_names[j]);
+ return log_msg_ret("part", ret);
+ fs_close();
+ ret = fs_set_blk_dev_with_part(desc, slot->root_part);
+ if (ret)
+ return log_msg_ret("part", ret);
+ fs_close();
}
- if (!exists)
- return log_msg_ret("fs", -ENOENT);
}
str_free_list(boot_order_list);
@@ -168,20 +168,24 @@ static int distro_rauc_read_bootflow(struct udevice *dev, struct bootflow *bflow
(slot = strsep(&boot_order_copy, " "));
i++) {
struct distro_rauc_slot *s;
+ struct distro_rauc_slot **new_slots;
s = calloc(1, sizeof(struct distro_rauc_slot));
s->name = strdup(slot);
s->boot_part = simple_strtoul(strsep(&parts, ","), NULL, 10);
s->root_part = simple_strtoul(strsep(&parts, ","), NULL, 10);
- priv->slots = realloc(priv->slots, (i + 1) *
- sizeof(struct distro_rauc_slot));
+ new_slots = realloc(priv->slots, (i + 1) *
+ sizeof(struct distro_rauc_slot));
+ if (!new_slots)
+ return log_msg_ret("buf", -ENOMEM);
+ priv->slots = new_slots;
priv->slots[i - 1] = s;
- priv->slots[i]->name = NULL;
+ priv->slots[i] = NULL;
}
bflow->bootmeth_priv = priv;
- ret = distro_rauc_scan_boot_part(bflow);
+ ret = distro_rauc_scan_parts(bflow);
if (ret < 0) {
for (i = 0; priv->slots[i]->name; i++) {
free(priv->slots[i]->name);