[PATCH 1/3] bootstd: Fix memleak on errors in bootmeth_setup_iter_order()

Tom Rini trini at konsulko.com
Fri Jun 20 00:35:20 CEST 2025


On Thu, Jun 19, 2025 at 05:04:23PM -0500, Sam Protsenko wrote:
> On Fri, Feb 7, 2025 at 7:26 PM Simon Glass <sjg at chromium.org> wrote:
> >
> > Hi Sam,
> >
> > On Fri, 7 Feb 2025 at 18:11, Sam Protsenko <semen.protsenko at linaro.org> wrote:
> > >
> > > On Tue, Jan 14, 2025 at 7:14 AM Simon Glass <sjg at chromium.org> wrote:
> > > >
> > > > On Sat, 11 Jan 2025 at 20:42, Sam Protsenko <semen.protsenko at linaro.org> wrote:
> > > > >
> > > > > Free memory allocated for 'order' (array of bootmeths) on error paths in
> > > > > bootmeth_setup_iter_order() function.
> > > > >
> > > > > Fixes: c627cfc14c08 ("bootstd: Allow scanning for global bootmeths separately")
> > > > > Fixes: 10d16faa436c ("bootstd: Detect empty bootmeth")
> > > > > Signed-off-by: Sam Protsenko <semen.protsenko at linaro.org>
> > > > > ---
> > > > >  boot/bootmeth-uclass.c | 16 ++++++++++++----
> > > > >  1 file changed, 12 insertions(+), 4 deletions(-)
> > > > >
> > > >
> > > > Reviewed-by: Simon Glass <sjg at chromium.org>
> > > >
> > > > How about adding a test to check there is no leak? You can see
> > > > test/lib/abuf.c for similar tests.
> > >
> > > That might be a good idea, and I already have the test code handy. But
> > > frankly I wasn't able to successfully run the current bootstd test in
> > > sandbox, it fails before it can get to memleak check I added. Firstly,
> > > when I do:
> > >
> > >     $ make sandbox_defconfig
> > >     $ make -j32
> > >     $ ./u-boot -T -c "ut bootstd"
> > >
> > > it says:
> > >
> > >     MMC:   Can't map file 'mmc1.img': Invalid argument
> > >
> > > and I can see only empty (zero size) mmc1.img in my U-Boot source code
> > > root dir. Then I was able to trigger its creation (I guess) by running
> > > Python suite somehow, so it generated 20 MiB mmc1.img. But even with
> > > that added, I hit this error:
> > >
> > >     test/boot/bootdev.c:218, bootdev_test_order():
> > >         0 == bootflow_scan_first(((void *)0), ((void *)0), &iter, 0, &bflow):
> > >         Expected 0x0 (0), got 0xffffffed (-19)
> > >
> > > I've read corresponding doc [1] ("Tests" section), but still don't
> > > understand how can I successfully run the bootstd test locally. If you
> > > can help me out, I can send the memleak test you mentioned in v2.
> >
> > You can run the bootstd tests with something like:
> >
> > test/py/test.py -B sandbox --build-dir /tmp/b/sandbox -k bootstd
> >
> > although it sounds like you have already figured that out. After you
> > do it once (to create the images) you can run the C tests directly as
> > you did above, but yes, sadly, some of the tests are affected by
> > others (with bootstd). You could take a look if you like.
> >
> 
> Is it possible to just apply this patch without a test? It's clearly
> fixing a memleak. Not that I'm lazy or anything, I came up with a test
> like below, but I don't want to send something that is quite hard to
> test. If you think this test is really essential, I can send it once
> bootstd tests are fixed and can be run in one command without any
> extra non-documented work.
> 
> 8<---------------------------------------------------------------------->8
> diff --git a/test/boot/bootdev.c b/test/boot/bootdev.c
> index 9af947868707..f4746ee4fb61 100644
> --- a/test/boot/bootdev.c
> +++ b/test/boot/bootdev.c
> @@ -194,6 +194,7 @@ static int bootdev_test_order(struct unit_test_state *uts)
>  {
>         struct bootflow_iter iter;
>         struct bootflow bflow;
> +       ulong start;
> 
>         test_set_skip_delays(true);
> 
> @@ -201,6 +202,8 @@ static int bootdev_test_order(struct unit_test_state *uts)
>         bootstd_reset_usb();
>         ut_assertok(run_command("usb start", 0));
> 
> +       start = ut_check_free();
> +
>         /*
>          * First try the order set by the bootdev-order property
>          * Like all sandbox unit tests this relies on the devicetree setting up
> @@ -277,6 +280,9 @@ static int bootdev_test_order(struct unit_test_state *uts)
>                         iter.dev_used[3]->name);
>         bootflow_iter_uninit(&iter);
> 
> +       /* Check for memory leaks */
> +       ut_assertok(ut_check_delta(start));
> +
>         return 0;
>  }
>  BOOTSTD_TEST(bootdev_test_order, UTF_DM | UTF_SCAN_FDT);
> 8<---------------------------------------------------------------------->8

Yes, we can do this in a follow-up I think. I'll take this series to
-next soon.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20250619/142ed2b7/attachment.sig>


More information about the U-Boot mailing list