Fix calculating the table size - it consists of a header + entries, not
just entries.
This bug caused the last entry to have garbage in its final fields,
including LowestSupportedFwVersion and CapsuleFlags, which (usually)
made fwupd to detect firmware update availability, but refuse actually
installing it.
Fixes: dc7da0874ba4 ("EFI: preserve the System Resource Table for dom0")
Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
---
xen/common/efi/boot.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
index 5b84dbf26e5e..45015a0dd583 100644
--- a/xen/common/efi/boot.c
+++ b/xen/common/efi/boot.c
@@ -675,7 +675,8 @@ static size_t __init get_esrt_size(const EFI_MEMORY_DESCRIPTOR *desc)
if ( esrt_ptr->FwResourceCount > available_len / sizeof(esrt_ptr->Entries[0]) )
return 0;
- return esrt_ptr->FwResourceCount * sizeof(esrt_ptr->Entries[0]);
+ return offsetof(EFI_SYSTEM_RESOURCE_TABLE, Entries) +
+ esrt_ptr->FwResourceCount * sizeof(esrt_ptr->Entries[0]);
}
static EFI_GUID __initdata esrt_guid = EFI_SYSTEM_RESOURCE_TABLE_GUID;
--
2.51.0
On 11/02/2026 12:16 am, Marek Marczykowski-Górecki wrote:
> Fix calculating the table size - it consists of a header + entries, not
> just entries.
> This bug caused the last entry to have garbage in its final fields,
> including LowestSupportedFwVersion and CapsuleFlags, which (usually)
> made fwupd to detect firmware update availability, but refuse actually
"made fwupd able to"
> installing it.
>
> Fixes: dc7da0874ba4 ("EFI: preserve the System Resource Table for dom0")
> Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
> ---
> xen/common/efi/boot.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
> index 5b84dbf26e5e..45015a0dd583 100644
> --- a/xen/common/efi/boot.c
> +++ b/xen/common/efi/boot.c
> @@ -675,7 +675,8 @@ static size_t __init get_esrt_size(const EFI_MEMORY_DESCRIPTOR *desc)
> if ( esrt_ptr->FwResourceCount > available_len / sizeof(esrt_ptr->Entries[0]) )
> return 0;
>
> - return esrt_ptr->FwResourceCount * sizeof(esrt_ptr->Entries[0]);
> + return offsetof(EFI_SYSTEM_RESOURCE_TABLE, Entries) +
> + esrt_ptr->FwResourceCount * sizeof(esrt_ptr->Entries[0]);
offsetof(EFI_SYSTEM_RESOURCE_TABLE, Entries[esrt_ptr->FwResourceCount])
is a shorter expression with the same answer, and a pattern we use
elsewhere. I can fix on commit if you're happy.
~Andrew
On Wed, Feb 11, 2026 at 12:58:25AM +0000, Andrew Cooper wrote:
> On 11/02/2026 12:16 am, Marek Marczykowski-Górecki wrote:
> > Fix calculating the table size - it consists of a header + entries, not
> > just entries.
> > This bug caused the last entry to have garbage in its final fields,
> > including LowestSupportedFwVersion and CapsuleFlags, which (usually)
> > made fwupd to detect firmware update availability, but refuse actually
>
> "made fwupd able to"
>
> > installing it.
> >
> > Fixes: dc7da0874ba4 ("EFI: preserve the System Resource Table for dom0")
> > Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
> > ---
> > xen/common/efi/boot.c | 3 ++-
> > 1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
> > index 5b84dbf26e5e..45015a0dd583 100644
> > --- a/xen/common/efi/boot.c
> > +++ b/xen/common/efi/boot.c
> > @@ -675,7 +675,8 @@ static size_t __init get_esrt_size(const EFI_MEMORY_DESCRIPTOR *desc)
> > if ( esrt_ptr->FwResourceCount > available_len / sizeof(esrt_ptr->Entries[0]) )
> > return 0;
> >
> > - return esrt_ptr->FwResourceCount * sizeof(esrt_ptr->Entries[0]);
> > + return offsetof(EFI_SYSTEM_RESOURCE_TABLE, Entries) +
> > + esrt_ptr->FwResourceCount * sizeof(esrt_ptr->Entries[0]);
>
> offsetof(EFI_SYSTEM_RESOURCE_TABLE, Entries[esrt_ptr->FwResourceCount])
>
> is a shorter expression with the same answer, and a pattern we use
> elsewhere. I can fix on commit if you're happy.
Fine with me, thanks.
--
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab
© 2016 - 2026 Red Hat, Inc.