[PATCH v5 3/4] lib: efi_loader: efi_memory.c: add efi_realloc() for realloc memory
Heinrich Schuchardt
xypron.glpk at gmx.de
Mon Jun 16 15:46:50 CEST 2025
On 16.06.25 15:09, Ilias Apalodimas wrote:
> Hi Paul
>
> [...]
>
>> +/**
>> + * efi_realloc() - reallocate boot services data pool memory
>> + *
>> + * Reallocate memory from pool for a new size and copy the data from old one.
>> + *
>> + * @ptr: pointer to old buffer
>> + * @size: number of bytes to allocate
>> + * Return: EFI status to indicate success or not
>> + */
>> +efi_status_t efi_realloc(void **ptr, size_t size)
>> +{
>> + efi_status_t ret;
>> + void *new_ptr;
>> + struct efi_pool_allocation *alloc;
>> + u64 num_pages = efi_size_in_pages(size +
>> + sizeof(struct efi_pool_allocation));
>> + size_t old_size;
>> +
>> + if (!*ptr) {
>> + *ptr = efi_alloc(size);
>
> Shouldn't you check that *ptr != NULL before returning success here?
Hello Ilias,
Do you mean "check that ptr != NULL"?
Best regards
Heinrich
>
>> + return EFI_SUCCESS;
>> + }
>> +
>> + ret = efi_check_allocated((uintptr_t)*ptr, true);
>> + if (ret != EFI_SUCCESS)
>> + return ret;
>> +
>> + alloc = container_of(*ptr, struct efi_pool_allocation, data);
>> +
>> + /* Check that this memory was allocated by efi_allocate_pool() */
>> + if (((uintptr_t)alloc & EFI_PAGE_MASK) ||
>> + alloc->checksum != checksum(alloc)) {
>> + printf("%s: illegal realloc 0x%p\n", __func__, *ptr);
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + /* Don't realloc. The actual size in pages is the same. */
>> + if (alloc->num_pages == num_pages)
>> + return EFI_SUCCESS;
>> +
>> + old_size = alloc->num_pages * EFI_PAGE_SIZE -
>> + sizeof(struct efi_pool_allocation);
>> +
>> + new_ptr = efi_alloc(size);
>> +
>> + /* copy old data to new alloced buffer */
>> + memcpy(new_ptr, *ptr, min(size, old_size));
>> +
>> + /* free the old buffer */
>> + efi_free_pool(*ptr);
>> +
>> + *ptr = new_ptr;
>> +
>> + return EFI_SUCCESS;
>> +}
>> +
>> /**
>> * efi_free_pool() - free memory from pool
>> *
>> --
>> 2.39.5
>>
>
> Thanks
> /Ilias
More information about the U-Boot
mailing list