|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv2] xen: Add EFI_LOAD_OPTION support
>>> On 04.01.18 at 21:33, <tamas@xxxxxxxxxxxxx> wrote:
> @@ -375,12 +385,52 @@ static void __init PrintErrMesg(const CHAR16 *mesg,
> EFI_STATUS ErrCode)
>
> static unsigned int __init get_argv(unsigned int argc, CHAR16 **argv,
> CHAR16 *cmdline, UINTN cmdsize,
> - CHAR16 **options)
> + CHAR16 **options, bool *elo_active)
> {
> CHAR16 *ptr = (CHAR16 *)(argv + argc + 1), *prev = NULL;
> bool prev_sep = true;
>
> - for ( ; cmdsize > sizeof(*cmdline) && *cmdline;
> + if ( cmdsize > sizeof(EFI_LOAD_OPTION) )
> + {
> + /* See include/efi/efiapi.h for more info about the following */
> + const EFI_LOAD_OPTION *elo = (const EFI_LOAD_OPTION *)cmdline;
The comment looks to be stale now.
> + /* The absolute minimum the size of the buffer it needs to be */
> + size_t size_check = sizeof(elo->Attributes) +
> + sizeof(elo->FilePathListLength) +
> + elo->FilePathListLength +
> + sizeof(CHAR16);
offsetof(EFI_LOAD_OPTION, Description) + elo->FilePathListLength
+ sizeof(<whatever-the-CHAR16-refers-to>)
I.e. perhaps
offsetof(EFI_LOAD_OPTION, Description[1]) + elo->FilePathListLength
> + if ( (elo->Attributes & LOAD_OPTION_ACTIVE) && size_check < cmdsize )
> + {
> + const CHAR16 *desc = elo->Description;
> + const UINT8 *opts = (const UINT8 *)desc;
With gcc's void pointer arithmetic allowing it, some of the code
would end up easier to read if this was const void *. Also this
variable should move into the more narrow scope it's used in.
> + size_t i = 0;
> +
> + /* Find Description string length in its possible space */
> + while ( i < cmdsize - size_check && *desc++ != L'\0')
> + i += sizeof(CHAR16);
sizeof(*desc) (also elsewhere - please always prefer using the
type of the actual object over an explicit type).
> + /* The Description has to end with a NULL char */
> + if ( *desc == L'\0' )
How does this work? The loop above has incremented desc already
past the nul terminator afaict.
> + {
> + UINTN new_cmdsize = cmdsize;
> +
> + opts += i + sizeof(CHAR16) + elo->FilePathListLength;
If you checked that this is within bounds, ...
> + new_cmdsize -= opts - (UINT8 *)elo;
> +
> + /* Sanity check the new cmdsize to avoid an underflow */
> + if ( new_cmdsize < cmdsize )
... you wouldn't need this check, and you wouldn't need the extra
new_cmdsize variable at all, likely making more obvious what you're
doing here.
And then - how about a different heuristic altogether: Current
code scans the pointed to memory for a nul character, being
happy if it is found before having exhausted cmdsize. Why not
simply scan for the first nul and conclude it's an EFI_LOAD_OPTION
structure if that nul isn't right at the end of the buffer? One could
even consider scanning for more than just nul, e.g. any non-blank
character with a numeric value below 0x0020.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |