efi/x86: Only copy upto the end of setup_header
authorArvind Sankar <nivedita@alum.mit.edu>
Thu, 18 Jun 2020 20:43:15 +0000 (16:43 -0400)
committerArd Biesheuvel <ardb@kernel.org>
Thu, 25 Jun 2020 16:09:48 +0000 (18:09 +0200)
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@alum.mit.edu>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
drivers/firmware/efi/libstub/x86-stub.c

index 37e82bf..3672539 100644 (file)
@@ -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