efi_loader: out of memory in efi_mem_carve_out
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sun, 30 Jul 2023 10:27:03 +0000 (12:27 +0200)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Thu, 3 Aug 2023 07:21:02 +0000 (09:21 +0200)
Handle out of memory situation in efi_mem_carve_out().

Fixes: 5d00995c361c ("efi_loader: Implement memory allocation and map")
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
lib/efi_loader/efi_memory.c

index 4630387..45d3bf5 100644 (file)
@@ -34,6 +34,7 @@ struct efi_mem_list {
 #define EFI_CARVE_NO_OVERLAP           -1
 #define EFI_CARVE_LOOP_AGAIN           -2
 #define EFI_CARVE_OVERLAPS_NONRAM      -3
+#define EFI_CARVE_OUT_OF_RESOURCES     -4
 
 /* This list contains all memory map items */
 static LIST_HEAD(efi_mem);
@@ -239,6 +240,8 @@ static s64 efi_mem_carve_out(struct efi_mem_list *map,
 
        /* Create a new map from [ carve_start ... map_end ] */
        newmap = calloc(1, sizeof(*newmap));
+       if (!newmap)
+               return EFI_CARVE_OUT_OF_RESOURCES;
        newmap->desc = map->desc;
        newmap->desc.physical_start = carve_start;
        newmap->desc.virtual_start = carve_start;
@@ -313,6 +316,9 @@ static efi_status_t efi_add_memory_map_pg(u64 start, u64 pages,
                        r = efi_mem_carve_out(lmem, &newlist->desc,
                                              overlap_only_ram);
                        switch (r) {
+                       case EFI_CARVE_OUT_OF_RESOURCES:
+                               free(newlist);
+                               return EFI_OUT_OF_RESOURCES;
                        case EFI_CARVE_OVERLAPS_NONRAM:
                                /*
                                 * The user requested to only have RAM overlaps,