On 11.08.18 17:28, Heinrich Schuchardt wrote:
> The EFI spec does not provide a length limit for variables.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.g...@gmx.de>
> ---
>  lib/efi_loader/efi_variable.c | 52 ++++++++++++++++++++---------------
>  1 file changed, 30 insertions(+), 22 deletions(-)
> 
> diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
> index 770c67abb9..495738884b 100644
> --- a/lib/efi_loader/efi_variable.c
> +++ b/lib/efi_loader/efi_variable.c
> @@ -44,10 +44,7 @@
>   * converted to utf16?
>   */
>  
> -#define MAX_VAR_NAME 31
> -#define MAX_NATIVE_VAR_NAME \
> -     (strlen("efi_xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx_") + \
> -             (MAX_VAR_NAME * MAX_UTF8_PER_UTF16))
> +#define PREFIX_LEN (strlen("efi_xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx_"))
>  
>  static int hex(int ch)
>  {
> @@ -101,18 +98,20 @@ static char *mem2hex(char *hexstr, const u8 *mem, int 
> count)
>       return hexstr;
>  }
>  
> -static efi_status_t efi_to_native(char *native, u16 *variable_name,
> +static efi_status_t efi_to_native(char **native, const u16 *variable_name,
>                                 efi_guid_t *vendor)
>  {
>       size_t len;
> +     char *pos;
>  
> -     len = u16_strlen((u16 *)variable_name);
> -     if (len >= MAX_VAR_NAME)
> -             return EFI_DEVICE_ERROR;
> +     len = PREFIX_LEN + utf16_utf8_strlen(variable_name) + 1;
> +     *native = malloc(len);
> +     if (!*native)
> +             return EFI_OUT_OF_RESOURCES;
>  
> -     native += sprintf(native, "efi_%pUl_", vendor);
> -     native  = (char *)utf16_to_utf8((u8 *)native, (u16 *)variable_name, 
> len);
> -     *native = '\0';
> +     pos = *native;
> +     pos += sprintf(pos, "efi_%pUl_", vendor);
> +     utf16_utf8_strcpy(&pos, variable_name);
>  
>       return EFI_SUCCESS;
>  }
> @@ -168,7 +167,7 @@ efi_status_t EFIAPI efi_get_variable(u16 *variable_name, 
> efi_guid_t *vendor,
>                                    u32 *attributes, efi_uintn_t *data_size,
>                                    void *data)
>  {
> -     char native_name[MAX_NATIVE_VAR_NAME + 1];
> +     char *native_name;

I think you want to predefine this to = NULL to make sure that an error
path doesn't give you uninitialized values on free().


Alex
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to