[PATCH v2] efi_loader: avoid adding variables twice

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Dec 29 09:13:22 CET 2022


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 at linaro.org>
Signed-off-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
---
changes since v1:
- Move the check in efi_var_restore(), since it would break updating
  variables in efi_var_mem_ins()

 lib/efi_loader/efi_var_file.c | 2 ++
 lib/efi_loader/efi_variable.c | 6 +++---
 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 3d58caa13da2..d70a72d12684 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 8ca2d85694c8..503a33ed65c5 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();
 }
--
2.38.1



More information about the U-Boot mailing list