Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:michael-chang:test:grub:old
grub2
0007-loader-i386-efi-linux-Fix-a-memory-leak-in...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0007-loader-i386-efi-linux-Fix-a-memory-leak-in-the-initr.patch of Package grub2
From d54a8646a9d15eb463016f4b2e4866cc2c7e619f Mon Sep 17 00:00:00 2001 From: Chris Coulson <chris.coulson@canonical.com> Date: Tue, 3 May 2022 09:47:35 +0200 Subject: [PATCH 07/26] loader/i386/efi/linux: Fix a memory leak in the initrd command Subsequent invocations of the initrd command result in the previous initrd being leaked, so fix that. Signed-off-by: Chris Coulson <chris.coulson@canonical.com> (cherry picked from commit d98af31ce1e31bb22163960d53f5eb28c66582a0) --- grub-core/loader/i386/efi/linux.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c index c9cd0a9a3..b33179003 100644 --- a/grub-core/loader/i386/efi/linux.c +++ b/grub-core/loader/i386/efi/linux.c @@ -170,6 +170,7 @@ grub_cmd_initrd (grub_command_t cmd, int argc, char *argv[]) grub_size_t size = 0; struct grub_linuxefi_context *context = (struct grub_linuxefi_context *) cmd->data; struct linux_kernel_params *params; + void *initrd_mem = 0; if (argc == 0) { @@ -189,30 +190,33 @@ grub_cmd_initrd (grub_command_t cmd, int argc, char *argv[]) goto fail; size = grub_get_initrd_size (&initrd_ctx); - context->initrd_mem = kernel_alloc(size, N_("can't allocate initrd")); - if (context->initrd_mem == NULL) + initrd_mem = kernel_alloc(size, N_("can't allocate initrd")); + if (initrd_mem == NULL) goto fail; - grub_dprintf ("linux", "initrd_mem = %p\n", context->initrd_mem); + grub_dprintf ("linux", "initrd_mem = %p\n", initrd_mem); params->ramdisk_size = LOW_U32(size); - params->ramdisk_image = LOW_U32(context->initrd_mem); + params->ramdisk_image = LOW_U32(initrd_mem); #if defined(__x86_64__) params->ext_ramdisk_size = HIGH_U32(size); - params->ext_ramdisk_image = HIGH_U32(context->initrd_mem); + params->ext_ramdisk_image = HIGH_U32(initrd_mem); #endif /* FIXME: Use bounce buffers as many UEFI machines apparently can't DMA * correctly above 4GB */ - if (grub_initrd_load (&initrd_ctx, argv, context->initrd_mem)) + if (grub_initrd_load (&initrd_ctx, argv, initrd_mem)) goto fail; + kernel_free(context->initrd_mem, params->ramdisk_size); + + context->initrd_mem = initrd_mem; params->ramdisk_size = size; fail: grub_initrd_close (&initrd_ctx); - if (context->initrd_mem && grub_errno) - grub_efi_free_pages((grub_efi_physical_address_t)(grub_addr_t)context->initrd_mem, BYTES_TO_PAGES(size)); + if (initrd_mem && grub_errno) + kernel_free (initrd_mem, size); return grub_errno; } -- 2.42.0
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