efi_loader: don't use memmove() in efi_var_mem_del()
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Wed, 22 Jul 2020 05:56:14 +0000 (07:56 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Wed, 22 Jul 2020 10:32:41 +0000 (12:32 +0200)
efi_var_mem_del() is in __efi_runtime because it would be needed for a
runtime implementation of SetVariable(). memmove() is not in __efi_runtime.
So we should not use it in efi_var_mem_del().

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_runtime.c
lib/efi_loader/efi_var_mem.c

index 91a4551..78fd801 100644 (file)
@@ -144,6 +144,8 @@ efi_status_t efi_init_runtime_supported(void)
  *
  * At runtime memcpy() is not available.
  *
+ * Overlapping memory areas can be copied safely if src >= dest.
+ *
  * @dest:      destination buffer
  * @src:       source buffer
  * @n:         number of bytes to copy
index 856e5e1..bfa8a56 100644 (file)
@@ -120,7 +120,8 @@ void __efi_runtime efi_var_mem_del(struct efi_var_entry *var)
               ALIGN((uintptr_t)data + var->length, 8);
        efi_var_buf->length -= (uintptr_t)next - (uintptr_t)var;
 
-       memmove(var, next, (uintptr_t)last - (uintptr_t)next);
+       /* efi_memcpy_runtime() can be used because next >= var. */
+       efi_memcpy_runtime(var, next, (uintptr_t)last - (uintptr_t)next);
        efi_var_buf->crc32 = crc32(0, (u8 *)efi_var_buf->var,
                                   efi_var_buf->length -
                                   sizeof(struct efi_var_file));