if ( fdt_size )
{
if ( fdt_open_into(dtbfile.ptr, new_fdt, pages * EFI_PAGE_SIZE) )
+ {
+ efi_bs->FreePages(fdt_addr, pages);
return NULL;
+ }
}
else
{
* system table that is passed in the FDT.
*/
if ( fdt_create_empty_tree(new_fdt, pages * EFI_PAGE_SIZE) )
+ {
+ efi_bs->FreePages(fdt_addr, pages);
return NULL;
+ }
}
/*
* code will free it. If the original FDT came from a configuration
* table, we don't own that memory and can't free it.
*/
- if ( dtbfile.size )
+ if ( dtbfile.need_to_free )
efi_bs->FreePages(dtbfile.addr, PFN_UP(dtbfile.size));
/* Update 'file' info for new memory so we clean it up on error exits */
dtbfile.addr = fdt_addr;
dtbfile.size = pages * EFI_PAGE_SIZE;
+ dtbfile.need_to_free = true;
return new_fdt;
}
static void __init efi_arch_blexit(void)
{
- if ( dtbfile.addr && dtbfile.size )
+ if ( dtbfile.need_to_free )
efi_bs->FreePages(dtbfile.addr, PFN_UP(dtbfile.size));
if ( memmap )
efi_bs->FreePool(memmap);
struct file {
UINTN size;
+ bool need_to_free;
union {
EFI_PHYSICAL_ADDRESS addr;
char *str;
if ( !efi_bs )
efi_arch_halt();
- if ( cfg.addr )
+ if ( cfg.need_to_free )
efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size));
- if ( kernel.addr )
+ if ( kernel.need_to_free )
efi_bs->FreePages(kernel.addr, PFN_UP(kernel.size));
- if ( ramdisk.addr )
+ if ( ramdisk.need_to_free )
efi_bs->FreePages(ramdisk.addr, PFN_UP(ramdisk.size));
- if ( xsm.addr )
+ if ( xsm.need_to_free )
efi_bs->FreePages(xsm.addr, PFN_UP(xsm.size));
efi_arch_blexit();
}
else
{
+ file->need_to_free = true;
file->size = size;
if ( file != &cfg )
{