efi_loader: check parameters of GetMemoryMap
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Mon, 2 Jul 2018 10:53:54 +0000 (12:53 +0200)
committerAlexander Graf <agraf@suse.de>
Wed, 25 Jul 2018 12:59:44 +0000 (14:59 +0200)
Check the parameters of boottime service GetMemoryMap().
Return EFI_INVALID_PARAMETER where required by the UEFI spec.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_loader/efi_memory.c

index f5aecd4b417f3d5bc9388556e555d2ec32b61961..bad87042695c25dfd7945a48e000da690b12d760 100644 (file)
@@ -453,6 +453,9 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
        struct list_head *lhandle;
        efi_uintn_t provided_map_size = *memory_map_size;
 
+       if (!memory_map_size)
+               return EFI_INVALID_PARAMETER;
+
        list_for_each(lhandle, &efi_mem)
                map_entries++;
 
@@ -463,6 +466,9 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
        if (provided_map_size < map_size)
                return EFI_BUFFER_TOO_SMALL;
 
+       if (!memory_map)
+               return EFI_INVALID_PARAMETER;
+
        if (descriptor_size)
                *descriptor_size = sizeof(struct efi_mem_desc);
 
@@ -470,19 +476,18 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
                *descriptor_version = EFI_MEMORY_DESCRIPTOR_VERSION;
 
        /* Copy list into array */
-       if (memory_map) {
-               /* Return the list in ascending order */
-               memory_map = &memory_map[map_entries - 1];
-               list_for_each(lhandle, &efi_mem) {
-                       struct efi_mem_list *lmem;
+       /* Return the list in ascending order */
+       memory_map = &memory_map[map_entries - 1];
+       list_for_each(lhandle, &efi_mem) {
+               struct efi_mem_list *lmem;
 
-                       lmem = list_entry(lhandle, struct efi_mem_list, link);
-                       *memory_map = lmem->desc;
-                       memory_map--;
-               }
+               lmem = list_entry(lhandle, struct efi_mem_list, link);
+               *memory_map = lmem->desc;
+               memory_map--;
        }
 
-       *map_key = 0;
+       if (map_key)
+               *map_key = 0;
 
        return EFI_SUCCESS;
 }