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: pointer to allocated memory or NULL > + */ > +void *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) > + return efi_alloc(size); > + > + ret = efi_check_allocated((uintptr_t)ptr, true); > + if (ret != EFI_SUCCESS) > + return ptr; This is a bit weird here. If we return a pointer how can we tell success vs failure? I think we should return EFI/SUCCESS fail and just pass a **ptr as an argument? Thanks /Ilias > + > + 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 ptr; > + } > + > + /* Don't realloc. The actual size in pages is the same. */ > + if (alloc->num_pages == num_pages) > + return ptr; > + > + 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); > + > + return new_ptr; > +} > + > /** > * efi_free_pool() - free memory from pool > * > -- > 2.39.5 >