Hi Frieder,

On 2026-10-29T16:23:07+11:00, Frieder Schrempf <[email protected]> wrote:
> bootstd: rauc: Free the boot script of a failed boot attempt
>
> The RAUC bootmeth loads the boot script when booting, not when reading
> the bootflow. If the boot fails, the bootflow keeps its private data and
> can be booted again, for example with another 'bootflow boot'. Each
> attempt then loads the script into a new buffer and adds another image
> to the bootflow, but the previous buffer, image list entry and subdir
> are never freed. 'bootstd images' lists one more copy of boot.scr after
> every attempt.
>
> Free what a previous attempt loaded before loading the script again,
> in the same way as bootflow_free(). Also check the strdup() of the
> subdir.
>
> Fixes: 7e5c2c782fb9 ("bootstd: Add implementation for bootmeth rauc")
> Assisted-by: LLM
> Signed-off-by: Frieder Schrempf <[email protected]>
>
>  boot/bootmeth_rauc.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)

> diff --git a/boot/bootmeth_rauc.c b/boot/bootmeth_rauc.c
> @@ -305,6 +306,15 @@ static int distro_rauc_load_boot_script(struct bootflow 
> *bflow,
> +     /* Drop the boot script of a previous, failed boot attempt */
> +     free(bflow->buf);
> +     bflow->buf = NULL;
> +     free(bflow->subdir);
> +     bflow->subdir = NULL;
> +     alist_for_each(img, &bflow->images)
> +             free(img->fname);
> +     alist_empty(&bflow->images);

The search loop below only runs while bflow->state != BOOTFLOWST_FILE,
so this reset only works if the previous attempt got as far as a
successful bootmeth_alloc_file(). If bootmeth_try_file() succeeds but
bootmeth_alloc_file() then fails with -E2BIG (or fs_read_alloc()
fails), the state stays at BOOTFLOWST_FILE. On the next attempt the
loop is skipped and bootmeth_alloc_file() is called with the stale
fname and size from the previous slot, even though bootmeth_setup_fs()
now points at a different partition. Please can you also put the state
back to BOOTFLOWST_READY here?

The image-freeing duplicates bootflow_free(), so should be in a helper
in bootflow.c which both can call. That would also fix the commit
message's claim to do this 'in the same way as bootflow_free()', which
is not quite true: bootflow_free() only frees buf when
BOOTFLOWF_STATIC_BUF is clear (although that flag is never set on this
path).

A test which boots the same bootflow twice and checks the image count
would be good, perhaps as a follow-up.

Regards,
Simon

Reply via email to