Skip to content

Commit 68d3fa2

Browse files
committed
Merge tag 'efi-urgent-for-v5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull EFI fixes from Borislav Petkov: "Forwarded EFI fixes from Ard Biesheuvel: - fix memory leak in efivarfs driver - fix HYP mode issue in 32-bit ARM version of the EFI stub when built in Thumb2 mode - avoid leaking EFI pgd pages on allocation failure" * tag 'efi-urgent-for-v5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: efi/x86: Free efi_pgd with free_pages() efivarfs: fix memory leak in efivarfs_create() efi/arm: set HSCTLR Thumb2 bit correctly for HVC calls from HYP
2 parents 7d53be5 + c2fe61d commit 68d3fa2

File tree

3 files changed

+17
-11
lines changed

3 files changed

+17
-11
lines changed

arch/arm/boot/compressed/head.S

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,6 +1472,9 @@ ENTRY(efi_enter_kernel)
14721472
@ issued from HYP mode take us to the correct handler code. We
14731473
@ will disable the MMU before jumping to the kernel proper.
14741474
@
1475+
ARM( bic r1, r1, #(1 << 30) ) @ clear HSCTLR.TE
1476+
THUMB( orr r1, r1, #(1 << 30) ) @ set HSCTLR.TE
1477+
mcr p15, 4, r1, c1, c0, 0
14751478
adr r0, __hyp_reentry_vectors
14761479
mcr p15, 4, r0, c12, c0, 0 @ set HYP vector base (HVBAR)
14771480
isb

arch/x86/platform/efi/efi_64.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,28 +78,30 @@ int __init efi_alloc_page_tables(void)
7878
gfp_mask = GFP_KERNEL | __GFP_ZERO;
7979
efi_pgd = (pgd_t *)__get_free_pages(gfp_mask, PGD_ALLOCATION_ORDER);
8080
if (!efi_pgd)
81-
return -ENOMEM;
81+
goto fail;
8282

8383
pgd = efi_pgd + pgd_index(EFI_VA_END);
8484
p4d = p4d_alloc(&init_mm, pgd, EFI_VA_END);
85-
if (!p4d) {
86-
free_page((unsigned long)efi_pgd);
87-
return -ENOMEM;
88-
}
85+
if (!p4d)
86+
goto free_pgd;
8987

9088
pud = pud_alloc(&init_mm, p4d, EFI_VA_END);
91-
if (!pud) {
92-
if (pgtable_l5_enabled())
93-
free_page((unsigned long) pgd_page_vaddr(*pgd));
94-
free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER);
95-
return -ENOMEM;
96-
}
89+
if (!pud)
90+
goto free_p4d;
9791

9892
efi_mm.pgd = efi_pgd;
9993
mm_init_cpumask(&efi_mm);
10094
init_new_context(NULL, &efi_mm);
10195

10296
return 0;
97+
98+
free_p4d:
99+
if (pgtable_l5_enabled())
100+
free_page((unsigned long)pgd_page_vaddr(*pgd));
101+
free_pgd:
102+
free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER);
103+
fail:
104+
return -ENOMEM;
103105
}
104106

105107
/*

fs/efivarfs/super.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ LIST_HEAD(efivarfs_list);
2121
static void efivarfs_evict_inode(struct inode *inode)
2222
{
2323
clear_inode(inode);
24+
kfree(inode->i_private);
2425
}
2526

2627
static const struct super_operations efivarfs_ops = {

0 commit comments

Comments
 (0)