mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
x86/efistub: Clear decompressor BSS in native EFI entrypoint
The EFI stub on x86 no longer invokes the decompressor as a subsequent boot stage, but calls into the decompression code directly while running in the context of the EFI boot services. This means that when using the native EFI entrypoint (as opposed to the EFI handover protocol, which clears BSS explicitly), the firmware PE image loader is being relied upon to ensure that BSS is zeroed before the EFI stub is entered from the firmware. As Radek's report proves, this is a bad idea. Not all loaders do this correctly, which means some global variables that should be statically initialized to 0x0 may have junk in them. So clear BSS explicitly when entering via efi_pe_entry(). Note that zeroing BSS from C code is not generally safe, but in this case, the following assignment and dereference of a global pointer variable ensures that the memset() cannot be deferred or reordered. Cc: <stable@kernel.org> # v6.1+ Reported-by: Radek Podgorny <radek@podgorny.cz> Closes: https://lore.kernel.org/all/a99a831a-8ad5-4cb0-bff9-be637311f771@podgorny.cz Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
parent
021bc4b9d7
commit
b3810c5a2c
@ -21,6 +21,8 @@
|
||||
#include "efistub.h"
|
||||
#include "x86-stub.h"
|
||||
|
||||
extern char _bss[], _ebss[];
|
||||
|
||||
const efi_system_table_t *efi_system_table;
|
||||
const efi_dxe_services_table_t *efi_dxe_table;
|
||||
static efi_loaded_image_t *image = NULL;
|
||||
@ -474,6 +476,8 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
|
||||
efi_status_t status;
|
||||
char *cmdline_ptr;
|
||||
|
||||
memset(_bss, 0, _ebss - _bss);
|
||||
|
||||
efi_system_table = sys_table_arg;
|
||||
|
||||
/* Check if we were booted by the EFI firmware */
|
||||
@ -967,8 +971,6 @@ fail:
|
||||
void efi_handover_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg,
|
||||
struct boot_params *boot_params)
|
||||
{
|
||||
extern char _bss[], _ebss[];
|
||||
|
||||
memset(_bss, 0, _ebss - _bss);
|
||||
efi_stub_entry(handle, sys_table_arg, boot_params);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user