[PATCH v2 1/2] efi_loader: correct reported length in GetNextVariable()
Punit Agrawal
punit1.agrawal at toshiba.co.jp
Tue Mar 24 09:45:44 CET 2020
Heinrich Schuchardt <xypron.glpk at gmx.de> writes:
> 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 at gmx.de>
> ---
> v2:
> correct return value of the initial call too
> ---
> lib/efi_loader/efi_variable.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
> index 99d2f01f57..3bec2d0d17 100644
> --- a/lib/efi_loader/efi_variable.c
> +++ b/lib/efi_loader/efi_variable.c
> @@ -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;
> - }
> +
Ah I see it's fixed in this version. Please ignore my comment on the
previous version.
Thanks,
Punit
> 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);
> --
> 2.25.1
More information about the U-Boot
mailing list