small fixes for Windows EFI install code

Fix potential crash caused by signed vs. unsigned comparison. Negative
length compares as very large unsigned number causing subsequent NULL access.

Make exhaustive search for all BootNNNN variables to find one matching
requested efi_distributor.
This commit is contained in:
Andrey Borzenkov 2013-12-15 22:00:15 +04:00
parent 80b865bdc8
commit e477187bf4
2 changed files with 18 additions and 5 deletions

View file

@ -1,3 +1,9 @@
2013-12-15 Andrey Borzenkov <arvidjaar@gmail.com>
* grub-core/osdep/windows/platform.c (grub_install_register_efi): Handle
unlikely errors when getting EFI variables and make exhaustive search
for all BootNNNN variables to find matching one.
2013-12-15 Ian Campbell <ijc@hellion.org.uk> 2013-12-15 Ian Campbell <ijc@hellion.org.uk>
* grub-core/kern/uboot/init.c: Fix units of uboot timer. * grub-core/kern/uboot/init.c: Fix units of uboot timer.

View file

@ -246,6 +246,8 @@ grub_install_register_efi (grub_device_t efidir_grub_dev,
void *current = NULL; void *current = NULL;
ssize_t current_len; ssize_t current_len;
current = get_efi_variable_bootn (i, &current_len); current = get_efi_variable_bootn (i, &current_len);
if (current_len < 0)
continue; /* FIXME Should we abort on error? */
if (current_len < (distrib16_len + 1) * sizeof (grub_uint16_t) if (current_len < (distrib16_len + 1) * sizeof (grub_uint16_t)
+ 6) + 6)
{ {
@ -275,13 +277,18 @@ grub_install_register_efi (grub_device_t efidir_grub_dev,
void *current = NULL; void *current = NULL;
ssize_t current_len; ssize_t current_len;
current = get_efi_variable_bootn (i, &current_len); current = get_efi_variable_bootn (i, &current_len);
if (current_len < -1)
continue; /* FIXME Should we abort on error? */
if (current_len == -1) if (current_len == -1)
{
if (!have_order_num)
{ {
order_num = i; order_num = i;
have_order_num = 1; have_order_num = 1;
grub_util_info ("Creating new entry at Boot%04x", grub_util_info ("Creating new entry at Boot%04x",
order_num); order_num);
break; }
continue;
} }
if (current_len < (distrib16_len + 1) * sizeof (grub_uint16_t) if (current_len < (distrib16_len + 1) * sizeof (grub_uint16_t)
+ 6) + 6)