aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlias Apalodimas <ilias.apalodimas@linaro.org>2022-12-29 10:13:22 +0200
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2022-12-29 10:51:50 +0100
commit77bb14758dcb1876c7bbfa4cead67c90f2d86a44 (patch)
treea8a225ba1fefb8bc0184d07537ceefe608f7817c
parentfcf583b4a7f74de1475a953bd934efcdd4e34309 (diff)
downloadu-boot-77bb14758dcb1876c7bbfa4cead67c90f2d86a44.zip
u-boot-77bb14758dcb1876c7bbfa4cead67c90f2d86a44.tar.gz
u-boot-77bb14758dcb1876c7bbfa4cead67c90f2d86a44.tar.bz2
efi_loader: avoid adding variables twice
When the efi subsystem starts we restore variables that are both in a file or stored into the .efi_runtime section of U-Boot. However once a variable gets created or changed the preseeded entries will end up in the file. As a consequence on the next boot we will end up adding identical variable entries twice. Fix this by checking if the to be inserted variable already exists. Also swap the restoration order and start with the file instead of the builtin variables, so a user can replace the preseeded ones if needed. Tested-by: Leo Yan <leo.yan@linaro.org> Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Reviewed-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
-rw-r--r--lib/efi_loader/efi_var_file.c2
-rw-r--r--lib/efi_loader/efi_variable.c6
2 files changed, 5 insertions, 3 deletions
diff --git a/lib/efi_loader/efi_var_file.c b/lib/efi_loader/efi_var_file.c
index de9ba8d..62e071b 100644
--- a/lib/efi_loader/efi_var_file.c
+++ b/lib/efi_loader/efi_var_file.c
@@ -187,6 +187,8 @@ efi_status_t efi_var_restore(struct efi_var_file *buf, bool safe)
continue;
if (!var->length)
continue;
+ if (efi_var_mem_find(&var->guid, var->name, NULL))
+ continue;
ret = efi_var_mem_ins(var->name, &var->guid, var->attr,
var->length, data, 0, NULL,
var->time);
diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
index 8ca2d85..503a33e 100644
--- a/lib/efi_loader/efi_variable.c
+++ b/lib/efi_loader/efi_variable.c
@@ -425,6 +425,9 @@ efi_status_t efi_init_variables(void)
if (ret != EFI_SUCCESS)
return ret;
+ ret = efi_var_from_file();
+ if (ret != EFI_SUCCESS)
+ return ret;
if (IS_ENABLED(CONFIG_EFI_VARIABLES_PRESEED)) {
ret = efi_var_restore((struct efi_var_file *)
__efi_var_file_begin, true);
@@ -432,9 +435,6 @@ efi_status_t efi_init_variables(void)
log_err("Invalid EFI variable seed\n");
}
- ret = efi_var_from_file();
- if (ret != EFI_SUCCESS)
- return ret;
return efi_init_secure_state();
}