[tip: efi/urgent] efi/x86: Only copy upto the end of setup_header

From: tip-bot2 for Arvind Sankar
Date: Wed Jul 22 2020 - 18:49:00 EST


The following commit has been merged into the efi/urgent branch of tip:

Commit-ID: 59476f80d8781a84e25f0cbcf378ccab1ad7abf8
Gitweb: https://git.kernel.org/tip/59476f80d8781a84e25f0cbcf378ccab1ad7abf8
Author: Arvind Sankar <nivedita@xxxxxxxxxxxx>
AuthorDate: Thu, 18 Jun 2020 16:43:15 -04:00
Committer: Ard Biesheuvel <ardb@xxxxxxxxxx>
CommitterDate: Thu, 25 Jun 2020 18:09:48 +02:00

efi/x86: Only copy upto the end of setup_header

When copying the setup_header into the boot_params buffer, only the data
that is actually part of the setup_header should be copied.

efi_pe_entry() currently copies the entire second sector, which
initializes some of the fields in boot_params beyond the setup_header
with garbage (i.e. part of the real-mode boot code gets copied into
those fields).

This does not cause any issues currently because the fields that are
overwritten are padding, BIOS EDD information that won't get used, and
the E820 table which will get properly filled in later.

Fix this to only copy data that is actually part of the setup_header
structure.

Signed-off-by: Arvind Sankar <nivedita@xxxxxxxxxxxx>
Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx>
---
drivers/firmware/efi/libstub/x86-stub.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
index 37e82bf..3672539 100644
--- a/drivers/firmware/efi/libstub/x86-stub.c
+++ b/drivers/firmware/efi/libstub/x86-stub.c
@@ -8,6 +8,7 @@

#include <linux/efi.h>
#include <linux/pci.h>
+#include <linux/stddef.h>

#include <asm/efi.h>
#include <asm/e820/types.h>
@@ -388,8 +389,9 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,

hdr = &boot_params->hdr;

- /* Copy the second sector to boot_params */
- memcpy(&hdr->jump, image_base + 512, 512);
+ /* Copy the setup header from the second sector to boot_params */
+ memcpy(&hdr->jump, image_base + 512,
+ sizeof(struct setup_header) - offsetof(struct setup_header, jump));

/*
* Fill out some of the header fields ourselves because the