[v2,06/17] efi_loader: keep attributes in efi_set_variable_int

Message ID 20200707031200.65511-7-xypron.glpk@gmx.de
State Superseded
Headers show
Series
  • efi_loader: non-volatile and runtime variables
Related show

Commit Message

Heinrich Schuchardt July 7, 2020, 3:11 a.m.
Do not change the value of parameter attributes in function
efi_set_variable_int(). This allows to use it later.

Do not use variable attr for different purposes but declare separate
variables (attr and old_attr).

Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
---
 lib/efi_loader/efi_variable.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

--
2.27.0

Patch

diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
index 6706438b26..a7de0b4022 100644
--- a/lib/efi_loader/efi_variable.c
+++ b/lib/efi_loader/efi_variable.c
@@ -827,7 +827,7 @@  efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,
 	efi_uintn_t old_size;
 	bool append, delete;
 	u64 time = 0;
-	u32 attr;
+	u32 old_attr;
 	efi_status_t ret = EFI_SUCCESS;

 	if (!variable_name || !*variable_name || !vendor ||
@@ -843,8 +843,8 @@  efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,

 	/* check if a variable exists */
 	old_size = 0;
-	attr = 0;
-	ret = efi_get_variable_int(variable_name, vendor, &attr,
+	old_attr = 0;
+	ret = efi_get_variable_int(variable_name, vendor, &old_attr,
 				   &old_size, NULL, &time);
 	append = !!(attributes & EFI_VARIABLE_APPEND_WRITE);
 	attributes &= ~(u32)EFI_VARIABLE_APPEND_WRITE;
@@ -852,15 +852,15 @@  efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,

 	/* check attributes */
 	if (old_size) {
-		if (ro_check && (attr & EFI_VARIABLE_READ_ONLY)) {
+		if (ro_check && (old_attr & EFI_VARIABLE_READ_ONLY)) {
 			ret = EFI_WRITE_PROTECTED;
 			goto err;
 		}

 		/* attributes won't be changed */
 		if (!delete &&
-		    ((ro_check && attr != attributes) ||
-		     (!ro_check && ((attr & ~(u32)EFI_VARIABLE_READ_ONLY)
+		    ((ro_check && old_attr != attributes) ||
+		     (!ro_check && ((old_attr & ~(u32)EFI_VARIABLE_READ_ONLY)
 				    != (attributes & ~(u32)EFI_VARIABLE_READ_ONLY))))) {
 			ret = EFI_INVALID_PARAMETER;
 			goto err;
@@ -902,7 +902,7 @@  efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,
 		    EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) {
 			ret = efi_variable_authenticate(variable_name, vendor,
 							&data_size, &data,
-							attributes, &attr,
+							attributes, &old_attr,
 							&time);
 			if (ret != EFI_SUCCESS)
 				goto err;
@@ -936,7 +936,7 @@  efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,
 			goto err;
 		}
 		ret = efi_get_variable_int(variable_name, vendor,
-					   &attr, &old_size, old_data, NULL);
+					   &old_attr, &old_size, old_data, NULL);
 		if (ret != EFI_SUCCESS)
 			goto err;
 	} else {
@@ -962,8 +962,8 @@  efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,
 		       EFI_VARIABLE_RUNTIME_ACCESS |
 		       EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
 	s += sprintf(s, "{");
-	while (attributes) {
-		attr = 1 << (ffs(attributes) - 1);
+	for (u32 attr_rem = attributes; attr_rem;) {
+		u32 attr = 1 << (ffs(attr_rem) - 1);

 		if (attr == EFI_VARIABLE_READ_ONLY) {
 			s += sprintf(s, "ro");
@@ -979,8 +979,8 @@  efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,
 			s = bin2hex(s, (u8 *)&time, sizeof(time));
 		}

-		attributes &= ~attr;
-		if (attributes)
+		attr_rem &= ~attr;
+		if (attr_rem)
 			s += sprintf(s, ",");
 	}
 	s += sprintf(s, "}");