Commit 0bf913e0 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'efi-fixes-for-v6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi

Pull EFI fixes from Ard Biesheuvel:

 - avoid a potential crash on the efi_subsys_init() error path

 - use more appropriate error code for runtime services calls issued
   after a crash in the firmware occurred

 - avoid READ_ONCE() for accessing firmware tables that may appear
   misaligned in memory

* tag 'efi-fixes-for-v6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi:
  efi: tpm: Avoid READ_ONCE() for accessing the event log
  efi: rt-wrapper: Add missing include
  efi: fix userspace infinite retry read efivars after EFI runtime services page fault
  efi: fix NULL-deref in init error path
parents 40d92fc4 d3f45053
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/assembler.h>
SYM_FUNC_START(__efi_rt_asm_wrapper) SYM_FUNC_START(__efi_rt_asm_wrapper)
stp x29, x30, [sp, #-112]! stp x29, x30, [sp, #-112]!
......
...@@ -394,8 +394,8 @@ static int __init efisubsys_init(void) ...@@ -394,8 +394,8 @@ static int __init efisubsys_init(void)
efi_kobj = kobject_create_and_add("efi", firmware_kobj); efi_kobj = kobject_create_and_add("efi", firmware_kobj);
if (!efi_kobj) { if (!efi_kobj) {
pr_err("efi: Firmware registration failed.\n"); pr_err("efi: Firmware registration failed.\n");
destroy_workqueue(efi_rts_wq); error = -ENOMEM;
return -ENOMEM; goto err_destroy_wq;
} }
if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE | if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE |
...@@ -443,7 +443,10 @@ static int __init efisubsys_init(void) ...@@ -443,7 +443,10 @@ static int __init efisubsys_init(void)
err_put: err_put:
kobject_put(efi_kobj); kobject_put(efi_kobj);
efi_kobj = NULL; efi_kobj = NULL;
destroy_workqueue(efi_rts_wq); err_destroy_wq:
if (efi_rts_wq)
destroy_workqueue(efi_rts_wq);
return error; return error;
} }
......
...@@ -62,6 +62,7 @@ struct efi_runtime_work efi_rts_work; ...@@ -62,6 +62,7 @@ struct efi_runtime_work efi_rts_work;
\ \
if (!efi_enabled(EFI_RUNTIME_SERVICES)) { \ if (!efi_enabled(EFI_RUNTIME_SERVICES)) { \
pr_warn_once("EFI Runtime Services are disabled!\n"); \ pr_warn_once("EFI Runtime Services are disabled!\n"); \
efi_rts_work.status = EFI_DEVICE_ERROR; \
goto exit; \ goto exit; \
} \ } \
\ \
......
...@@ -198,8 +198,8 @@ static __always_inline int __calc_tpm2_event_size(struct tcg_pcr_event2_head *ev ...@@ -198,8 +198,8 @@ static __always_inline int __calc_tpm2_event_size(struct tcg_pcr_event2_head *ev
* The loop below will unmap these fields if the log is larger than * The loop below will unmap these fields if the log is larger than
* one page, so save them here for reference: * one page, so save them here for reference:
*/ */
count = READ_ONCE(event->count); count = event->count;
event_type = READ_ONCE(event->event_type); event_type = event->event_type;
/* Verify that it's the log header */ /* Verify that it's the log header */
if (event_header->pcr_idx != 0 || if (event_header->pcr_idx != 0 ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment