efi_loader: QueryMode() must allocate buffer
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 15 Jun 2019 12:07:40 +0000 (14:07 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 20 Jun 2019 22:26:15 +0000 (22:26 +0000)
EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode() must allocate a buffer for the
mode information structure.

Adjust the unit test to free the buffer.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_gop.c
lib/efi_selftest/efi_selftest_gop.c

index 676463f2de053bbbdbc20901993565692f13e845..2385c0f3b13852fd72f8a08939d7556102d93d91 100644 (file)
@@ -51,8 +51,12 @@ static efi_status_t EFIAPI gop_query_mode(struct efi_gop *this, u32 mode_number,
        }
 
        gopobj = container_of(this, struct efi_gop_obj, ops);
+       ret = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, sizeof(gopobj->info),
+                               (void **)info);
+       if (ret != EFI_SUCCESS)
+               goto out;
        *size_of_info = sizeof(gopobj->info);
-       *info = &gopobj->info;
+       memcpy(*info, &gopobj->info, sizeof(gopobj->info));
 
 out:
        return EFI_EXIT(ret);
index 4ad043c59743bf056e73c08b9b58cf703bce168d..d64294ac79d7dbe66577715e6b9d223322fd4927 100644 (file)
@@ -80,6 +80,11 @@ static int execute(void)
                }
                efi_st_printf("Mode %u: %u x %u\n",
                              i, info->width, info->height);
+               ret = boottime->free_pool(info);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_printf("FreePool failed");
+                       return EFI_ST_FAILURE;
+               }
        }
 
        return EFI_ST_SUCCESS;