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: 04be2c3a06 ("efi/boot.c: add file.need_to_free")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
Jan Beulich committed 2020-10-15 12:30:01 +02:00
1 parent 44ac57af81
commit a8a85f03c8
2 files changed
+6 -6

No files matched your search

+1 -1
View File
@@ -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 )
{
/*
+5 -5
View File
@@ -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 '");
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.