From a8a85f03c826bea045e345fa405f187049d63584 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 15 Oct 2020 12:30:01 +0200 Subject: [PATCH] EFI: further "need_to_free" adjustments When processing "chain" directives, the previously loaded config file gets freed. This needs to be recorded accordingly such that no error path would try to free the same block of memory a 2nd time. Furthermore, neither .addr nor .size being zero has any meaning towards the need to free an allocated chunk anymore. Drop (from read_file()) and replace (in Arm's efi_arch_use_config_file(), to sensibly retain the comment) respective assignments. Fixes: 04be2c3a0678 ("efi/boot.c: add file.need_to_free") Signed-off-by: Jan Beulich Reviewed-by: Stefano Stabellini --- xen/arch/arm/efi/efi-boot.h | 2 +- xen/common/efi/boot.c | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h index f64a6604af..cf9c37153f 100644 --- a/xen/arch/arm/efi/efi-boot.h +++ b/xen/arch/arm/efi/efi-boot.h @@ -591,7 +591,7 @@ static bool __init efi_arch_use_config_file(EFI_SYSTEM_TABLE *SystemTable) fdt = lookup_fdt_config_table(SystemTable); dtbfile.ptr = fdt; - dtbfile.size = 0; /* Config table memory can't be freed, so set size to 0 */ + dtbfile.need_to_free = false; /* Config table memory can't be freed. */ if ( !fdt || fdt_node_offset_by_compatible(fdt, 0, "multiboot,module") < 0 ) { /* diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c index eb1ef91ba4..63e289ab85 100644 --- a/xen/common/efi/boot.c +++ b/xen/common/efi/boot.c @@ -601,10 +601,7 @@ static bool __init read_file(EFI_FILE_HANDLE dir_handle, CHAR16 *name, PFN_UP(size), &file->addr); } if ( EFI_ERROR(ret) ) - { - file->addr = 0; what = what ?: L"Allocation"; - } else { file->need_to_free = true; @@ -1271,8 +1268,11 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) name.s = get_value(&cfg, "global", "chain"); if ( !name.s ) break; - efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); - cfg.addr = 0; + if ( cfg.need_to_free ) + { + efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); + cfg.need_to_free = false; + } if ( !read_file(dir_handle, s2w(&name), &cfg, NULL) ) { PrintStr(L"Chained configuration file '"); -- 2.39.5