|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2] xen/efi: Fix crash with initial empty EFI options
On Tue, Jul 08, 2025 at 05:41:07PM +0200, Jan Beulich wrote:
> On 08.07.2025 15:56, Frediano Ziglio wrote:
> > EFI code path split options from EFI LoadOptions fields in 2
> > pieces, first EFI options, second Xen options.
> > "get_argv" function is called first to get the number of arguments
> > in the LoadOptions, second, after allocating enough space, to
> > fill some "argc"/"argv" variable. However the first parsing could
> > be different from second as second is able to detect "--" argument
> > separator. So it was possible that "argc" was bigger that the "argv"
> > array leading to potential buffer overflows, in particular
> > a string like "-- a b c" would lead to buffer overflow in "argv"
> > resulting in crashes.
> > Using EFI shell is possible to pass any kind of string in
> > LoadOptions.
> >
> > Fixes: bf6501a62e80 ("x86-64: EFI boot code")
>
> Have you convinced yourself that your change isn't a workaround for a
> bug elsewhere? You said you repro-ed with grub's chainloader, but that
> doesn't imply things are being got correct there. I can certainly
> accept that I may have screwed up back then. But I'd like to understand
> what the mistake was, and so far I don't see any. As before, being
> passed just "-- a b c" looks like a bug in the code generating the
> command line.
Even if that's invalid command line (is it? what if you want to pass
only options to dom0, but not to xen itself?), it shouldn't result in a
crash but in an error message.
> > @@ -429,7 +430,7 @@ static unsigned int __init get_argv(unsigned int argc,
> > CHAR16 **argv,
> > prev_sep = cur_sep;
> > }
> > if ( argv )
> > - *argv = NULL;
> > + argv[argc] = NULL;
>
> Strictly speaking the need for this sentinel now disappears, doesn't it?
> As does ...
>
> > return argc;
> > }
> >
> > @@ -1348,8 +1349,8 @@ void EFIAPI __init noreturn efi_start(EFI_HANDLE
> > ImageHandle,
> > (argc + 1) * sizeof(*argv) +
> > loaded_image->LoadOptionsSize,
> > (void **)&argv) == EFI_SUCCESS )
> > - get_argv(argc, argv, loaded_image->LoadOptions,
> > - loaded_image->LoadOptionsSize, &offset, &options);
> > + argc = get_argv(argc, argv, loaded_image->LoadOptions,
> > + loaded_image->LoadOptionsSize, &offset,
> > &options);
> > else
> > argc = 0;
> > for ( i = 1; i < argc; ++i )
>
> ... the need for
>
> if ( !ptr )
> break;
>
> just out of context here?
>
> Jan
--
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab
Attachment:
signature.asc
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |