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
