Haven't had a chance to test this yet, but LGTM. Acked-by: Martin Schwan <[email protected]>
On Mon, 2026-01-05 at 21:26 +0100, Francois Berder wrote: > While reading bootflow, memory was not released if an > error occurred. > > Signed-off-by: Francois Berder <[email protected]> > --- > boot/bootmeth_rauc.c | 51 ++++++++++++++++++++++++++++++++++-------- > -- > 1 file changed, 40 insertions(+), 11 deletions(-) > > diff --git a/boot/bootmeth_rauc.c b/boot/bootmeth_rauc.c > index 833715e1395..432d170e006 100644 > --- a/boot/bootmeth_rauc.c > +++ b/boot/bootmeth_rauc.c > @@ -139,12 +139,12 @@ static int distro_rauc_scan_parts(struct > bootflow *bflow) > > static int distro_rauc_read_bootflow(struct udevice *dev, struct > bootflow *bflow) > { > - struct distro_rauc_priv *priv; > - int ret; > + struct distro_rauc_priv *priv = NULL; > + int ret = 0; > char *slot; > int i; > - char *partitions; > - char *boot_order; > + char *partitions = NULL; > + char *boot_order = NULL; > const char *default_boot_order; > const char **default_boot_order_list; > char *boot_order_copy; > @@ -176,10 +176,22 @@ static int distro_rauc_read_bootflow(struct > udevice *dev, struct bootflow *bflow > if (!priv) > return log_msg_ret("buf", -ENOMEM); > priv->slots = calloc(1, sizeof(struct distro_rauc_slot)); > + if (!priv->slots) { > + free(priv); > + return log_msg_ret("buf", -ENOMEM); > + } > > /* Copy default boot_order, so we can leave the original > unmodified */ > boot_order_copy = strdup(default_boot_order); > + if (!boot_order_copy) { > + ret = log_msg_ret("buf", -ENOMEM); > + goto rauc_read_bootflow_err; > + } > partitions = strdup(CONFIG_BOOTMETH_RAUC_PARTITIONS); > + if (!partitions) { > + ret = log_msg_ret("buf", -ENOMEM); > + goto rauc_read_bootflow_err; > + } > > for (i = 1; > (parts = strsep(&partitions, " ")) && > @@ -189,13 +201,26 @@ static int distro_rauc_read_bootflow(struct > udevice *dev, struct bootflow *bflow > struct distro_rauc_slot **new_slots; > > s = calloc(1, sizeof(struct distro_rauc_slot)); > + if (!s) { > + ret = log_msg_ret("buf", -ENOMEM); > + goto rauc_read_bootflow_err; > + } > s->name = strdup(slot); > + if (!s->name) { > + free(s); > + ret = log_msg_ret("buf", -ENOMEM); > + goto rauc_read_bootflow_err; > + } > s->boot_part = simple_strtoul(strsep(&parts, ","), > NULL, 10); > s->root_part = simple_strtoul(strsep(&parts, ","), > NULL, 10); > new_slots = realloc(priv->slots, (i + 1) * > sizeof(struct > distro_rauc_slot)); > - if (!new_slots) > - return log_msg_ret("buf", -ENOMEM); > + if (!new_slots) { > + free(s->name); > + free(s); > + ret = log_msg_ret("buf", -ENOMEM); > + goto rauc_read_bootflow_err; > + } > priv->slots = new_slots; > priv->slots[i - 1] = s; > priv->slots[i] = NULL; > @@ -204,15 +229,19 @@ static int distro_rauc_read_bootflow(struct > udevice *dev, struct bootflow *bflow > bflow->bootmeth_priv = priv; > > ret = distro_rauc_scan_parts(bflow); > - if (ret < 0) { > - distro_rauc_priv_free(priv); > - free(boot_order_copy); > - return ret; > - } > + if (ret < 0) > + goto rauc_read_bootflow_err; > > bflow->state = BOOTFLOWST_READY; > > return 0; > + > +rauc_read_bootflow_err: > + distro_rauc_priv_free(priv); > + free(boot_order_copy); > + free(partitions); > + > + return ret; > } > > static int distro_rauc_read_file(struct udevice *dev, struct > bootflow *bflow,

