diff mbox series

[1/2] efi_loader: correct reported length in GetNextVariable()

Message ID 20200320182820.149823-2-xypron.glpk@gmx.de
State New
Headers show
Series efi_loader: correct reported length in GetNextVariable() | expand

Commit Message

Heinrich Schuchardt March 20, 2020, 6:28 p.m. UTC
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>
---
 lib/efi_loader/efi_variable.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--
2.25.1

Comments

Punit Agrawal March 24, 2020, 8:41 a.m. UTC | #1
Hi Heinrich,

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>
> ---
>  lib/efi_loader/efi_variable.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
> index c316bdfec0..04ead34c6f 100644
> --- a/lib/efi_loader/efi_variable.c
> +++ b/lib/efi_loader/efi_variable.c
> @@ -299,7 +299,7 @@ static efi_status_t parse_uboot_variable(char *variable,
>  	p = variable_name;
>  	utf8_utf16_strncpy(&p, name, name_len);
>  	variable_name[name_len] = 0;
> -	*variable_name_size = name_len + 1;
> +	*variable_name_size = sizeof(u16) * (name_len + 1);

Maybe I am missing something, but isn't a similar fix needed in the
function where the buffer is checked for sufficient size?

For context, I am referring to

	if (*variable_name_size < (name_len + 1)) {
		*variable_name_size = name_len + 1;
		return EFI_BUFFER_TOO_SMALL;
	}

Thanks,
Punit

>
>  	/* guid */
>  	c = *(name - 1);
> --
> 2.25.1
AKASHI Takahiro March 30, 2020, 6:40 a.m. UTC | #2
On Fri, Mar 20, 2020 at 07:28:19PM +0100, Heinrich Schuchardt wrote:
> 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().

Please also correct a function description of GetNextVariable().

-Takahiro Akashi


> Fixes: d99a87f84b75 ("efi_loader: implement GetNextVariableName()")
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
>  lib/efi_loader/efi_variable.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
> index c316bdfec0..04ead34c6f 100644
> --- a/lib/efi_loader/efi_variable.c
> +++ b/lib/efi_loader/efi_variable.c
> @@ -299,7 +299,7 @@ static efi_status_t parse_uboot_variable(char *variable,
>  	p = variable_name;
>  	utf8_utf16_strncpy(&p, name, name_len);
>  	variable_name[name_len] = 0;
> -	*variable_name_size = name_len + 1;
> +	*variable_name_size = sizeof(u16) * (name_len + 1);
> 
>  	/* guid */
>  	c = *(name - 1);
> --
> 2.25.1
>
diff mbox series

Patch

diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
index c316bdfec0..04ead34c6f 100644
--- a/lib/efi_loader/efi_variable.c
+++ b/lib/efi_loader/efi_variable.c
@@ -299,7 +299,7 @@  static efi_status_t parse_uboot_variable(char *variable,
 	p = variable_name;
 	utf8_utf16_strncpy(&p, name, name_len);
 	variable_name[name_len] = 0;
-	*variable_name_size = name_len + 1;
+	*variable_name_size = sizeof(u16) * (name_len + 1);

 	/* guid */
 	c = *(name - 1);