[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/2] xen/efi: Handle cases where file didn't come from ESP
On Tue, Jun 24, 2025 at 03:27:08PM +0100, Frediano Ziglio wrote: > A boot loader can load files from outside ESP. > In these cases device could be not provided or path could > be something not supported. > In these cases allows to boot anyway, all information > could be provided using UKI or using other boot loader > features. > > Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxx> Acked-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx> > --- > Changes since v1: > - set "leaf" to NULL instead of a buffer with an empty string; > - keep read_file fatal if cannot load file (except configuration). > --- > xen/common/efi/boot.c | 34 +++++++++++++++++++++++++++++----- > 1 file changed, 29 insertions(+), 5 deletions(-) > > diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c > index 1a9b4e7dae..b18af2f1f4 100644 > --- a/xen/common/efi/boot.c > +++ b/xen/common/efi/boot.c > @@ -443,6 +443,18 @@ static EFI_FILE_HANDLE __init get_parent_handle(const > EFI_LOADED_IMAGE *loaded_i > CHAR16 *pathend, *ptr; > EFI_STATUS ret; > > + /* > + * In some cases the image could not come from a specific device. > + * For instance this can happen if Xen was loaded using GRUB2 "linux" > + * command. > + */ > + *leaf = NULL; > + if ( !loaded_image->DeviceHandle ) > + { > + PrintStr(L"Xen image loaded without providing a device\r\n"); > + return NULL; > + } > + > do { > EFI_FILE_IO_INTERFACE *fio; > > @@ -466,7 +478,15 @@ static EFI_FILE_HANDLE __init get_parent_handle(const > EFI_LOADED_IMAGE *loaded_i > > if ( DevicePathType(dp) != MEDIA_DEVICE_PATH || > DevicePathSubType(dp) != MEDIA_FILEPATH_DP ) > - blexit(L"Unsupported device path component"); > + { > + /* > + * The image could come from an unsupported device. > + * For instance this can happen if Xen was loaded using GRUB2 > + * "chainloader" command and the file was not from ESP. > + */ > + PrintStr(L"Unsupported device path component\r\n"); > + return NULL; > + } > > if ( *buffer ) > { > @@ -772,8 +792,11 @@ static bool __init read_file(EFI_FILE_HANDLE dir_handle, > CHAR16 *name, > > if ( !name ) > PrintErrMesg(L"No filename", EFI_OUT_OF_RESOURCES); > - ret = dir_handle->Open(dir_handle, &FileHandle, name, > - EFI_FILE_MODE_READ, 0); > + if ( dir_handle ) > + ret = dir_handle->Open(dir_handle, &FileHandle, name, > + EFI_FILE_MODE_READ, 0); > + else > + ret = EFI_NOT_FOUND; > if ( file == &cfg && ret == EFI_NOT_FOUND ) > return false; > if ( EFI_ERROR(ret) ) > @@ -1404,7 +1427,7 @@ void EFIAPI __init noreturn efi_start(EFI_HANDLE > ImageHandle, > /* Read and parse the config file. */ > if ( read_section(loaded_image, L"config", &cfg, NULL) ) > PrintStr(L"Using builtin config file\r\n"); > - else if ( !cfg_file_name ) > + else if ( !cfg_file_name && file_name) > { > CHAR16 *tail; > > @@ -1515,7 +1538,8 @@ void EFIAPI __init noreturn efi_start(EFI_HANDLE > ImageHandle, > efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); > cfg.addr = 0; > > - dir_handle->Close(dir_handle); > + if ( dir_handle ) > + dir_handle->Close(dir_handle); > > if ( gop && !base_video ) > { > -- > 2.43.0 > -- Best Regards, Marek Marczykowski-Górecki Invisible Things Lab Attachment:
signature.asc
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |