On Tue, Jul 16, 2024 at 05:45:10AM GMT, Oliver Steffen wrote:
> Quoting Michael Chang via Grub-devel (2024-07-16 08:55:00)
> > The get_part_uuid() function made an assumption that the target grub
> > device is a partition device and accessed device->disk->partition
> > without checking for NULL. There are four situations where this
> > assumption is problematic:
> >
> > 1. The device is a net device instead of a disk.
> > 2. The device is an abstraction device, like LVM, RAID, or CRYPTO, which
> >    is mostly logical "disk" ((lvmid/<UUID>) and so on).
> > 3. Firmware RAID may present the ESP to grub as an EFI disk (hd0) device
> >    if it is contained within a Linux software RAID.
> > 4. When booting from an ISO, the ESP is treated as an El Torito image in
> >    the boot catalog. It is therefore presented by firmware and
> >    interpreted by grub as a disk (cd0).
> >
> > As a result, get_part_uuid() could lead to a NULL pointer dereference
> > and trigger a synchronous exception during boot if the ESP falls into
> > one of these categories. This patch fixes the problem by adding the
> > necessary checks to handle cases where the ESP is not a partition
> > device.
> >
> > Additionally, to avoid disrupting the boot process, this patch relaxes
> > the severity of the errors in this context to non-critical. Errors will
> > be logged, but they will not prevent the boot process from continuing.
> >
> > Fixes: e0fa7dc84 (bli: Add a module for the Boot Loader Interface)
> > Signed-off-by: Michael Chang <mch...@suse.com>
> > ---
> >  grub-core/commands/bli.c | 20 +++++++++++++++++++-
> >  1 file changed, 19 insertions(+), 1 deletion(-)
> >
> > diff --git a/grub-core/commands/bli.c b/grub-core/commands/bli.c
> > index e0d8a54f7..298c5f70a 100644
> > --- a/grub-core/commands/bli.c
> > +++ b/grub-core/commands/bli.c
> > @@ -48,6 +48,22 @@ get_part_uuid (const char *device_name, char **part_uuid)
> >    if (device == NULL)
> >      return grub_error (grub_errno, N_("cannot open device: %s"), 
> > device_name);
> >
> > +  if (device->disk == NULL)
> > +    {
> > +      grub_dprintf ("bli", "%s is not a disk device, partuuid skipped\n", 
> > device_name);
> > +      *part_uuid = NULL;
> > +      grub_device_close (device);
> > +      return GRUB_ERR_NONE;
> > +    }
> > +
> > +  if (device->disk->partition == NULL)
> > +    {
> > +      grub_dprintf ("bli", "%s has no partition, partuuid skipped\n", 
> > device_name);
> > +      *part_uuid = NULL;
> > +      grub_device_close (device);
> > +      return GRUB_ERR_NONE;
> > +    }
> > +
> >    disk = grub_disk_open (device->disk->name);
> >    if (disk == NULL)
> >      {
> > @@ -99,7 +115,7 @@ set_loader_device_part_uuid (void)
> >
> >    status = get_part_uuid (device_name, &part_uuid);
> >
> > -  if (status == GRUB_ERR_NONE)
> > +  if (status == GRUB_ERR_NONE && part_uuid)
> >      status = grub_efi_set_variable_to_string ("LoaderDevicePartUUID", 
> > &bli_vendor_guid, part_uuid,
> >                                               
> > GRUB_EFI_VARIABLE_BOOTSERVICE_ACCESS |
> >                                               
> > GRUB_EFI_VARIABLE_RUNTIME_ACCESS);
> > @@ -117,4 +133,6 @@ GRUB_MOD_INIT (bli)
> >                                    GRUB_EFI_VARIABLE_BOOTSERVICE_ACCESS |
> >                                    GRUB_EFI_VARIABLE_RUNTIME_ACCESS);
> >    set_loader_device_part_uuid ();
> > +  /* No error here is critical, other than being logged */
> > +  grub_print_error ();
> >  }
> > --
> > 2.45.2
> >
> >
> 
> Reviewed-By: Oliver Steffen <ostef...@redhat.com>

Thank you! I'll add your Reviewed-By in next revision.

Regards,
Michael

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to