Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.3
grub2
grub2-efi-Free-malloc-regions-on-exit.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File grub2-efi-Free-malloc-regions-on-exit.patch of Package grub2
From 0c5fbc745846a53cc04ac1052cfbd35c699394c5 Mon Sep 17 00:00:00 2001 From: Alexander Graf <agraf@suse.de> Date: Thu, 19 May 2016 15:01:06 +0200 Subject: [PATCH] efi: Free malloc regions on exit When we exit grub, we don't free all the memory that we allocated earlier for our heap region. This can cause problems with setups where you try to descend the boot order using "exit" entries, such as PXE -> HD boot scenarios. Signed-off-by: Alexander Graf <agraf@suse.de> --- grub-core/kern/efi/init.c | 1 + grub-core/kern/efi/mm.c | 24 ++++++++++++++++++++++++ include/grub/efi/efi.h | 1 + 3 files changed, 26 insertions(+) Index: grub-2.02~beta3/grub-core/kern/efi/init.c =================================================================== --- grub-2.02~beta3.orig/grub-core/kern/efi/init.c +++ grub-2.02~beta3/grub-core/kern/efi/init.c @@ -167,4 +167,5 @@ grub_efi_fini (void) { grub_efidisk_fini (); grub_console_fini (); + grub_efi_memory_fini (); } Index: grub-2.02~beta3/grub-core/kern/efi/mm.c =================================================================== --- grub-2.02~beta3.orig/grub-core/kern/efi/mm.c +++ grub-2.02~beta3/grub-core/kern/efi/mm.c @@ -49,6 +49,12 @@ static grub_efi_uintn_t finish_desc_size static grub_efi_uint32_t finish_desc_version; int grub_efi_is_finished = 0; +struct efi_allocation { + grub_uint64_t start_addr; + grub_uint64_t pages; +} efi_allocated_memory[16]; +unsigned int efi_allocated_memory_idx = 0; + /* Allocate pages below a specified address */ void * grub_efi_allocate_pages_max (grub_efi_physical_address_t max, @@ -440,6 +446,13 @@ add_memory_regions (grub_efi_memory_desc (void *) ((grub_addr_t) start), (unsigned) pages); + /* Track up to 16 regions that we allocate from */ + if (efi_allocated_memory_idx < ARRAY_SIZE(efi_allocated_memory)) { + efi_allocated_memory[efi_allocated_memory_idx].start_addr = start; + efi_allocated_memory[efi_allocated_memory_idx].pages = pages; + efi_allocated_memory_idx++; + } + grub_mm_init_region (addr, PAGES_TO_BYTES (pages)); required_pages -= pages; @@ -451,6 +464,17 @@ add_memory_regions (grub_efi_memory_desc grub_fatal ("too little memory"); } +void +grub_efi_memory_fini (void) +{ + unsigned int i; + + for (i = 0; i < efi_allocated_memory_idx; i++) { + grub_efi_free_pages (efi_allocated_memory[i].start_addr, + efi_allocated_memory[i].pages); + } +} + #if 0 /* Print the memory map. */ static void Index: grub-2.02~beta3/include/grub/efi/efi.h =================================================================== --- grub-2.02~beta3.orig/include/grub/efi/efi.h +++ grub-2.02~beta3/include/grub/efi/efi.h @@ -51,6 +51,7 @@ EXPORT_FUNC(grub_efi_get_memory_map) (gr grub_efi_uintn_t *map_key, grub_efi_uintn_t *descriptor_size, grub_efi_uint32_t *descriptor_version); +void grub_efi_memory_fini (void); grub_efi_loaded_image_t *EXPORT_FUNC(grub_efi_get_loaded_image) (grub_efi_handle_t image_handle); void EXPORT_FUNC(grub_efi_print_device_path) (grub_efi_device_path_t *dp); char *EXPORT_FUNC(grub_efi_get_filename) (grub_efi_device_path_t *dp);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor