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

Reply via email to