]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi_loader: keep attributes in efi_set_variable_int
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Wed, 17 Jun 2020 10:20:46 +0000 (12:20 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 11 Jul 2020 21:14:17 +0000 (23:14 +0200)
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@gmx.de>
lib/efi_loader/efi_variable.c

index 36bac8670279861e1a42f2f653ef3372ae830570..c9980ca69296618518f2e0306f2c111dfbc30d4f 100644 (file)
@@ -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, "}");