* [PATCH] fwu: fix read buffer size
@ 2026-09-15 14:29 Vincent Stehlé
2026-09-15 14:32 ` Kory Maincent
2026-09-17 15:26 ` Ilias Apalodimas
0 siblings, 2 replies; 5+ messages in thread
From: Vincent Stehlé @ 2026-09-15 14:29 UTC (permalink / raw)
To: Sughosh Ganu, u-boot
Cc: Etienne Carriere, Ilias Apalodimas, Kory Maincent, Tom Rini,
Vincent Stehlé
When the trial_counter_read() function reads its counter from the
TrialStateCtr UEFI Variable, it erroneously computes the return buffer
size to be the size of a pointer instead of a u16.
As the UEFI Variable is always created by trial_counter_update() with
the right size before any read attempt, overflow cannot happen in
practice, but fix the size computation for correctness.
Fixes: 7e9814cc6c1d ("FWU: Add boot time checks as highlighted by the FWU specification")
Signed-off-by: Vincent Stehlé <vincent.stehle@arm.com>
Cc: Sughosh Ganu <sughosh.ganu@arm.com>
Cc: Kory Maincent <kory.maincent@bootlin.com>
Cc: Tom Rini <trini@konsulko.com>
---
Hi,
This has been tested on the sandbox, with CONFIG_FWU_MULTI_BANK_UPDATE=y
& CONFIG_FWU_MDATA_V2=y, and with a modified fwu_boottime_checks()
function doing essentially the following sequence:
efi_init_obj_list();
trial_counter_update();
trial_counter_read();
---
lib/fwu_updates/fwu.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/fwu_updates/fwu.c b/lib/fwu_updates/fwu.c
index e9bb1b4fc65..24a8f1ce5b2 100644
--- a/lib/fwu_updates/fwu.c
+++ b/lib/fwu_updates/fwu.c
@@ -82,7 +82,7 @@ static int trial_counter_read(u16 *trial_state_ctr)
efi_status_t status;
efi_uintn_t var_size;
- var_size = (efi_uintn_t)sizeof(trial_state_ctr);
+ var_size = (efi_uintn_t)sizeof(*trial_state_ctr);
status = efi_get_variable_int(u"TrialStateCtr",
&efi_global_variable_guid,
NULL,
---
base-commit: a44f46af0aa17e48572e0d46c0d082886ee353c3
change-id: 20260914-fwu-24265a691f9a
Best regards,
--
Vincent.
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] fwu: fix read buffer size
2026-09-15 14:29 [PATCH] fwu: fix read buffer size Vincent Stehlé
@ 2026-09-15 14:32 ` Kory Maincent
2026-09-17 15:26 ` Ilias Apalodimas
1 sibling, 0 replies; 5+ messages in thread
From: Kory Maincent @ 2026-09-15 14:32 UTC (permalink / raw)
To: Vincent Stehlé, Sughosh Ganu, u-boot
Cc: Etienne Carriere, Ilias Apalodimas, Tom Rini
On 9/15/26 16:29, Vincent Stehlé wrote:
> When the trial_counter_read() function reads its counter from the
> TrialStateCtr UEFI Variable, it erroneously computes the return buffer
> size to be the size of a pointer instead of a u16.
>
> As the UEFI Variable is always created by trial_counter_update() with
> the right size before any read attempt, overflow cannot happen in
> practice, but fix the size computation for correctness.
Reviewed-by: Kory Maincent <kory.maincent@bootlin.com>
Thank you!
--
Köry Maincent, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] fwu: fix read buffer size
2026-09-15 14:29 [PATCH] fwu: fix read buffer size Vincent Stehlé
2026-09-15 14:32 ` Kory Maincent
@ 2026-09-17 15:26 ` Ilias Apalodimas
2026-09-18 13:45 ` Vincent Stehlé
1 sibling, 1 reply; 5+ messages in thread
From: Ilias Apalodimas @ 2026-09-17 15:26 UTC (permalink / raw)
To: Vincent Stehlé, Sughosh Ganu, u-boot
Cc: Etienne Carriere, Kory Maincent, Tom Rini
Hi Vincent,
On Tue Sep 15, 2026 at 5:29 PM EEST, Vincent Stehlé wrote:
> When the trial_counter_read() function reads its counter from the
> TrialStateCtr UEFI Variable, it erroneously computes the return buffer
> size to be the size of a pointer instead of a u16.
>
> As the UEFI Variable is always created by trial_counter_update() with
> the right size before any read attempt, overflow cannot happen in
> practice, but fix the size computation for correctness.
The fix is correct, but the commit message if a bit off. The creation
is not the reason the read works. It works because the current sizeof is
always > of the new updated sizeof so the GetVariable calls has enough size
to fix the output.
Cheers
/Ilias
>
> Fixes: 7e9814cc6c1d ("FWU: Add boot time checks as highlighted by the FWU specification")
> Signed-off-by: Vincent Stehlé <vincent.stehle@arm.com>
> Cc: Sughosh Ganu <sughosh.ganu@arm.com>
> Cc: Kory Maincent <kory.maincent@bootlin.com>
> Cc: Tom Rini <trini@konsulko.com>
> ---
> Hi,
>
> This has been tested on the sandbox, with CONFIG_FWU_MULTI_BANK_UPDATE=y
> & CONFIG_FWU_MDATA_V2=y, and with a modified fwu_boottime_checks()
> function doing essentially the following sequence:
>
> efi_init_obj_list();
> trial_counter_update();
> trial_counter_read();
> ---
> lib/fwu_updates/fwu.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/lib/fwu_updates/fwu.c b/lib/fwu_updates/fwu.c
> index e9bb1b4fc65..24a8f1ce5b2 100644
> --- a/lib/fwu_updates/fwu.c
> +++ b/lib/fwu_updates/fwu.c
> @@ -82,7 +82,7 @@ static int trial_counter_read(u16 *trial_state_ctr)
> efi_status_t status;
> efi_uintn_t var_size;
>
> - var_size = (efi_uintn_t)sizeof(trial_state_ctr);
> + var_size = (efi_uintn_t)sizeof(*trial_state_ctr);
> status = efi_get_variable_int(u"TrialStateCtr",
> &efi_global_variable_guid,
> NULL,
>
> ---
> base-commit: a44f46af0aa17e48572e0d46c0d082886ee353c3
> change-id: 20260914-fwu-24265a691f9a
>
> Best regards,
> --
> Vincent.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] fwu: fix read buffer size
2026-09-17 15:26 ` Ilias Apalodimas
@ 2026-09-18 13:45 ` Vincent Stehlé
2026-09-18 14:38 ` Ilias Apalodimas
0 siblings, 1 reply; 5+ messages in thread
From: Vincent Stehlé @ 2026-09-18 13:45 UTC (permalink / raw)
To: Ilias Apalodimas
Cc: Sughosh Ganu, u-boot, Etienne Carriere, Kory Maincent, Tom Rini
On Thu, Sep 17, 2026 at 06:26:37PM +0300, Ilias Apalodimas wrote:
> Hi Vincent,
>
> On Tue Sep 15, 2026 at 5:29 PM EEST, Vincent Stehlé wrote:
> > When the trial_counter_read() function reads its counter from the
> > TrialStateCtr UEFI Variable, it erroneously computes the return buffer
> > size to be the size of a pointer instead of a u16.
> >
> > As the UEFI Variable is always created by trial_counter_update() with
> > the right size before any read attempt, overflow cannot happen in
> > practice, but fix the size computation for correctness.
>
> The fix is correct, but the commit message if a bit off. The creation
> is not the reason the read works. It works because the current sizeof is
> always > of the new updated sizeof so the GetVariable calls has enough size
> to fix the output.
Hi Ilias,
Thank you for reviewing.
Is that not the other way around?
In the patch the call to GetVariable() was truncated but here are the
details:
status = efi_get_variable_int(
u"TrialStateCtr",
&efi_global_variable_guid,
NULL,
&var_size, // data_size
trial_state_ctr, // data
NULL);
We are telling GetVariable() to read as much as 4 to 8 bytes
(sizeof(trial_state_ctr), the size of a pointer, in var_size), into a 2
bytes buffer (the u16 pointed to by trial_state_ctr).
I think what saves us here is that we are sure the variable contains
only 2 bytes, which will never overflow.
Best regards,
Vincent.
>
>
> Cheers
> /Ilias
> >
> > Fixes: 7e9814cc6c1d ("FWU: Add boot time checks as highlighted by the FWU specification")
> > Signed-off-by: Vincent Stehlé <vincent.stehle@arm.com>
> > Cc: Sughosh Ganu <sughosh.ganu@arm.com>
> > Cc: Kory Maincent <kory.maincent@bootlin.com>
> > Cc: Tom Rini <trini@konsulko.com>
> > ---
> > Hi,
> >
> > This has been tested on the sandbox, with CONFIG_FWU_MULTI_BANK_UPDATE=y
> > & CONFIG_FWU_MDATA_V2=y, and with a modified fwu_boottime_checks()
> > function doing essentially the following sequence:
> >
> > efi_init_obj_list();
> > trial_counter_update();
> > trial_counter_read();
> > ---
> > lib/fwu_updates/fwu.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/lib/fwu_updates/fwu.c b/lib/fwu_updates/fwu.c
> > index e9bb1b4fc65..24a8f1ce5b2 100644
> > --- a/lib/fwu_updates/fwu.c
> > +++ b/lib/fwu_updates/fwu.c
> > @@ -82,7 +82,7 @@ static int trial_counter_read(u16 *trial_state_ctr)
> > efi_status_t status;
> > efi_uintn_t var_size;
> >
> > - var_size = (efi_uintn_t)sizeof(trial_state_ctr);
> > + var_size = (efi_uintn_t)sizeof(*trial_state_ctr);
> > status = efi_get_variable_int(u"TrialStateCtr",
> > &efi_global_variable_guid,
> > NULL,
> >
> > ---
> > base-commit: a44f46af0aa17e48572e0d46c0d082886ee353c3
> > change-id: 20260914-fwu-24265a691f9a
> >
> > Best regards,
> > --
> > Vincent.
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] fwu: fix read buffer size
2026-09-18 13:45 ` Vincent Stehlé
@ 2026-09-18 14:38 ` Ilias Apalodimas
0 siblings, 0 replies; 5+ messages in thread
From: Ilias Apalodimas @ 2026-09-18 14:38 UTC (permalink / raw)
To: Vincent Stehlé
Cc: Sughosh Ganu, u-boot, Etienne Carriere, Kory Maincent, Tom Rini
On Fri, 18 Sept 2026 at 16:45, Vincent Stehlé <vincent.stehle@arm.com> wrote:
>
> On Thu, Sep 17, 2026 at 06:26:37PM +0300, Ilias Apalodimas wrote:
> > Hi Vincent,
> >
> > On Tue Sep 15, 2026 at 5:29 PM EEST, Vincent Stehlé wrote:
> > > When the trial_counter_read() function reads its counter from the
> > > TrialStateCtr UEFI Variable, it erroneously computes the return buffer
> > > size to be the size of a pointer instead of a u16.
> > >
> > > As the UEFI Variable is always created by trial_counter_update() with
> > > the right size before any read attempt, overflow cannot happen in
> > > practice, but fix the size computation for correctness.
> >
> > The fix is correct, but the commit message if a bit off. The creation
> > is not the reason the read works. It works because the current sizeof is
> > always > of the new updated sizeof so the GetVariable calls has enough size
> > to fix the output.
>
> Hi Ilias,
>
> Thank you for reviewing.
>
> Is that not the other way around?
> In the patch the call to GetVariable() was truncated but here are the
> details:
>
> status = efi_get_variable_int(
> u"TrialStateCtr",
> &efi_global_variable_guid,
> NULL,
> &var_size, // data_size
> trial_state_ctr, // data
> NULL);
>
> We are telling GetVariable() to read as much as 4 to 8 bytes
> (sizeof(trial_state_ctr), the size of a pointer, in var_size), into a 2
> bytes buffer (the u16 pointed to by trial_state_ctr).
> I think what saves us here is that we are sure the variable contains
> only 2 bytes, which will never overflow.
Yep, I misread the patch the first time. But indeed
efi_get_variable_int() only copies the actual data length
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
>
> Best regards,
> Vincent.
>
> >
> >
> > Cheers
> > /Ilias
> > >
> > > Fixes: 7e9814cc6c1d ("FWU: Add boot time checks as highlighted by the FWU specification")
> > > Signed-off-by: Vincent Stehlé <vincent.stehle@arm.com>
> > > Cc: Sughosh Ganu <sughosh.ganu@arm.com>
> > > Cc: Kory Maincent <kory.maincent@bootlin.com>
> > > Cc: Tom Rini <trini@konsulko.com>
> > > ---
> > > Hi,
> > >
> > > This has been tested on the sandbox, with CONFIG_FWU_MULTI_BANK_UPDATE=y
> > > & CONFIG_FWU_MDATA_V2=y, and with a modified fwu_boottime_checks()
> > > function doing essentially the following sequence:
> > >
> > > efi_init_obj_list();
> > > trial_counter_update();
> > > trial_counter_read();
> > > ---
> > > lib/fwu_updates/fwu.c | 2 +-
> > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/lib/fwu_updates/fwu.c b/lib/fwu_updates/fwu.c
> > > index e9bb1b4fc65..24a8f1ce5b2 100644
> > > --- a/lib/fwu_updates/fwu.c
> > > +++ b/lib/fwu_updates/fwu.c
> > > @@ -82,7 +82,7 @@ static int trial_counter_read(u16 *trial_state_ctr)
> > > efi_status_t status;
> > > efi_uintn_t var_size;
> > >
> > > - var_size = (efi_uintn_t)sizeof(trial_state_ctr);
> > > + var_size = (efi_uintn_t)sizeof(*trial_state_ctr);
> > > status = efi_get_variable_int(u"TrialStateCtr",
> > > &efi_global_variable_guid,
> > > NULL,
> > >
> > > ---
> > > base-commit: a44f46af0aa17e48572e0d46c0d082886ee353c3
> > > change-id: 20260914-fwu-24265a691f9a
> > >
> > > Best regards,
> > > --
> > > Vincent.
> >
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-09-18 14:39 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-15 14:29 [PATCH] fwu: fix read buffer size Vincent Stehlé
2026-09-15 14:32 ` Kory Maincent
2026-09-17 15:26 ` Ilias Apalodimas
2026-09-18 13:45 ` Vincent Stehlé
2026-09-18 14:38 ` Ilias Apalodimas
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.