Skip to content

Commit 4152433

Browse files
ozbenhardbiesheuvel
authored andcommitted
arm64: efi: kaslr: Fix occasional random alloc (and boot) failure
The EFI stub random allocator used for kaslr on arm64 has a subtle bug. In function get_entry_num_slots() which counts the number of possible allocation "slots" for the image in a given chunk of free EFI memory, "last_slot" can become negative if the chunk is smaller than the requested allocation size. The test "if (first_slot > last_slot)" doesn't catch it because both first_slot and last_slot are unsigned. I chose not to make them signed to avoid problems if this is ever used on architectures where there are meaningful addresses with the top bit set. Instead, fix it with an additional test against the allocation size. This can cause a boot failure in addition to a loss of randomisation due to another bug in the arm64 stub fixed separately. Signed-off-by: Benjamin Herrenschmidt <[email protected]> Fixes: 2ddbfc8 ("efi: stub: add implementation of efi_random_alloc()") Signed-off-by: Ard Biesheuvel <[email protected]>
1 parent 47e1e23 commit 4152433

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

drivers/firmware/efi/libstub/randomalloc.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ static unsigned long get_entry_num_slots(efi_memory_desc_t *md,
3030

3131
region_end = min(md->phys_addr + md->num_pages * EFI_PAGE_SIZE - 1,
3232
(u64)ULONG_MAX);
33+
if (region_end < size)
34+
return 0;
3335

3436
first_slot = round_up(md->phys_addr, align);
3537
last_slot = round_down(region_end - size + 1, align);

0 commit comments

Comments
 (0)