[PATCH v5 3/4] lib: efi_loader: efi_memory.c: add efi_realloc() for realloc memory
Ilias Apalodimas
ilias.apalodimas at linaro.org
Mon Jun 16 17:34:37 CEST 2025
On Mon, 16 Jun 2025 at 16:46, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> 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"?
No i mean that the efi_alloc() call can fail as well
Thanks
/Ilias
>
> 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