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é <[email protected]>
> > Cc: Sughosh Ganu <[email protected]>
> > Cc: Kory Maincent <[email protected]>
> > Cc: Tom Rini <[email protected]>
> > ---
> > 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.
> 

Reply via email to