From: Heinrich Schuchardt <xypron.glpk@gmx.de>
Date: Sat, 15 Jun 2019 12:07:40 +0000 (+0200)
Subject: efi_loader: QueryMode() must allocate buffer
X-Git-Tag: v2025.01-rc5-pxa1908~2918^2~12
X-Git-Url: http://git.dujemihanovic.xyz/html/static/gitweb.css?a=commitdiff_plain;h=97cf20861ac2a359bcde930d4ab17cec70da81f7;p=u-boot.git

efi_loader: QueryMode() must allocate buffer

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>
---

diff --git a/lib/efi_loader/efi_gop.c b/lib/efi_loader/efi_gop.c
index 676463f2de..2385c0f3b1 100644
--- a/lib/efi_loader/efi_gop.c
+++ b/lib/efi_loader/efi_gop.c
@@ -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);
diff --git a/lib/efi_selftest/efi_selftest_gop.c b/lib/efi_selftest/efi_selftest_gop.c
index 4ad043c597..d64294ac79 100644
--- a/lib/efi_selftest/efi_selftest_gop.c
+++ b/lib/efi_selftest/efi_selftest_gop.c
@@ -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;