efi_loader: correct reported length in GetNextVariable()
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Fri, 20 Mar 2020 18:04:34 +0000 (19:04 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sun, 22 Mar 2020 10:06:23 +0000 (11:06 +0100)
The runtime service GetNextVariable() returns the length of the next
variable including the closing 0x0000. This length should be in bytes.

Comparing the output of EDK2 and U-Boot shows that this is currently not
correctly implemented:

EDK2:
OsIndicationsSupported: 46
PlatformLang: 26
PlatformLangCodes: 36

U-Boot:
OsIndicationsSupported: 23
PlatformLang: 13
PlatformLangCodes: 18

Provide correct length in GetNextVariable().

Fixes: d99a87f84b75 ("efi_loader: implement GetNextVariableName()")
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_variable.c

index 99d2f01f5748958d24d91392cfef1aa0d052bf21..3bec2d0d17ad2002af04d9ada8a36287cf8fc03f 100644 (file)
@@ -273,7 +273,8 @@ static efi_status_t parse_uboot_variable(char *variable,
                                         u32 *attributes)
 {
        char *guid, *name, *end, c;
-       unsigned long name_len;
+       size_t name_len;
+       efi_uintn_t old_variable_name_size;
        u16 *p;
 
        guid = strchr(variable, '_');
@@ -289,17 +290,17 @@ static efi_status_t parse_uboot_variable(char *variable,
                return EFI_INVALID_PARAMETER;
 
        name_len = end - name;
-       if (*variable_name_size < (name_len + 1)) {
-               *variable_name_size = name_len + 1;
+       old_variable_name_size = *variable_name_size;
+       *variable_name_size = sizeof(u16) * (name_len + 1);
+       if (old_variable_name_size < *variable_name_size)
                return EFI_BUFFER_TOO_SMALL;
-       }
+
        end++; /* point to value */
 
        /* variable name */
        p = variable_name;
        utf8_utf16_strncpy(&p, name, name_len);
        variable_name[name_len] = 0;
-       *variable_name_size = name_len + 1;
 
        /* guid */
        c = *(name - 1);