Skip to content

Commit

Permalink
efi_loader: Fix memory map size check to avoid out-of-bounds access
Browse files Browse the repository at this point in the history
The current efi_get_memory_map() function overwrites the map_size
property before reading its value. That way the sanity check whether our
memory map fits into the given array always succeeds, potentially
overwriting arbitrary payload memory.

This patch moves the property update write after its sanity check, so
that the check actually verifies the correct value.

So far this has not triggered any known bugs, but we're better off safe
than sorry.

If the buffer is to small, the returned memory_map_size indicates the
required size to the caller.

Signed-off-by: Stefan Brüns <[email protected]>
Reviewed-by: Alexander Graf <[email protected]>
Signed-off-by: Alexander Graf <[email protected]>
  • Loading branch information
StefanBruens authored and agraf committed Oct 18, 2016
1 parent 852efbf commit bdf5c1b
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/efi_loader/efi_memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ efi_status_t efi_get_memory_map(unsigned long *memory_map_size,
ulong map_size = 0;
int map_entries = 0;
struct list_head *lhandle;
unsigned long provided_map_size = *memory_map_size;

list_for_each(lhandle, &efi_mem)
map_entries++;
Expand All @@ -350,7 +351,7 @@ efi_status_t efi_get_memory_map(unsigned long *memory_map_size,
if (descriptor_version)
*descriptor_version = EFI_MEMORY_DESCRIPTOR_VERSION;

if (*memory_map_size < map_size)
if (provided_map_size < map_size)
return EFI_BUFFER_TOO_SMALL;

/* Copy list into array */
Expand Down

0 comments on commit bdf5c1b

Please sign in to comment.