diff mbox

uefirtvariable: modify getnextvariablename test for VariableNameSize smaller than 2 (LP: #1593597)

Message ID 1466153906-23285-1-git-send-email-ivan.hu@canonical.com
State Accepted
Headers show

Commit Message

Ivan Hu June 17, 2016, 8:58 a.m. UTC
Some firmwares (mostly on AMI Bios), the implementation limitation was seen
that the VariableNameSize of the GetNextVariableName should lager or equal to 2.
They believe that it should at least have a Null-terminated(2 bytes) for the
name buffer.

So test getnextvariablename with VariableNameSize 0 and 1 will get the
EFI_INVALID_PARAMETER, not expected EFI_BUFFER_TOO_SMALL.

UEFI spec doesn't describe it clearly, VariableName is the Null-treminated
string, so the EFI_INVALID_PARAMETER seems also a resonable return when
VariableNameSize smaller than 2.
Before the spec has a clearly description, for the fwts getnextvariablename
buffer too small test(getnextvariable_test4),
1. add the VariableNameSize 2 for the test, if VariableNameSize 2 without
returning EFI_BUFFER_TOO_SMALL, then test fail.
2. if VariableNameSize is 0 or 1, allow the extra return EFI_INVALID_PARAMETER.

Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
---
 src/uefi/uefirtvariable/uefirtvariable.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Colin Ian King June 17, 2016, 9:03 a.m. UTC | #1
On 17/06/16 11:58, Ivan Hu wrote:
> Some firmwares (mostly on AMI Bios), the implementation limitation was seen
> that the VariableNameSize of the GetNextVariableName should lager or equal to 2.
> They believe that it should at least have a Null-terminated(2 bytes) for the
> name buffer.
> 
> So test getnextvariablename with VariableNameSize 0 and 1 will get the
> EFI_INVALID_PARAMETER, not expected EFI_BUFFER_TOO_SMALL.
> 
> UEFI spec doesn't describe it clearly, VariableName is the Null-treminated
> string, so the EFI_INVALID_PARAMETER seems also a resonable return when
> VariableNameSize smaller than 2.
> Before the spec has a clearly description, for the fwts getnextvariablename
> buffer too small test(getnextvariable_test4),
> 1. add the VariableNameSize 2 for the test, if VariableNameSize 2 without
> returning EFI_BUFFER_TOO_SMALL, then test fail.
> 2. if VariableNameSize is 0 or 1, allow the extra return EFI_INVALID_PARAMETER.
> 
> Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
> ---
>  src/uefi/uefirtvariable/uefirtvariable.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
> index 0514805..aca0202 100644
> --- a/src/uefi/uefirtvariable/uefirtvariable.c
> +++ b/src/uefi/uefirtvariable/uefirtvariable.c
> @@ -812,8 +812,7 @@ static int getnextvariable_test4(fwts_framework *fw)
>  		goto err;
>  	}
>  
> -	/* No first result can be 0 or 1 byte in size. */
> -	for (i = 0; i < 2; i++) {
> +	for (i = 0; i < 3; i++) {
>  		variablenamesize = i;
>  		getnextvariablename.VariableNameSize = &variablenamesize;
>  
> @@ -831,6 +830,8 @@ static int getnextvariable_test4(fwts_framework *fw)
>  		 * EFI_NOT_FOUND at this point.
>  		 */
>  		if (ioret != -1 || status != EFI_BUFFER_TOO_SMALL) {
> +			if (i != 2 && status == EFI_INVALID_PARAMETER)
> +				continue;
>  			fwts_failed(fw, LOG_LEVEL_HIGH,
>  				"UEFIRuntimeGetNextVariableName",
>  				"Expected EFI_BUFFER_TOO_SMALL with small "
> 
Given that the spec is not clear, this seems like the best approach.

Acked-by: Colin Ian King <colin.king@canonical.com>
Alex Hung June 17, 2016, 9:07 a.m. UTC | #2
On 2016-06-17 05:03 PM, Colin Ian King wrote:
> On 17/06/16 11:58, Ivan Hu wrote:
>> Some firmwares (mostly on AMI Bios), the implementation limitation was seen
>> that the VariableNameSize of the GetNextVariableName should lager or equal to 2.
>> They believe that it should at least have a Null-terminated(2 bytes) for the
>> name buffer.
>>
>> So test getnextvariablename with VariableNameSize 0 and 1 will get the
>> EFI_INVALID_PARAMETER, not expected EFI_BUFFER_TOO_SMALL.
>>
>> UEFI spec doesn't describe it clearly, VariableName is the Null-treminated
>> string, so the EFI_INVALID_PARAMETER seems also a resonable return when
>> VariableNameSize smaller than 2.
>> Before the spec has a clearly description, for the fwts getnextvariablename
>> buffer too small test(getnextvariable_test4),
>> 1. add the VariableNameSize 2 for the test, if VariableNameSize 2 without
>> returning EFI_BUFFER_TOO_SMALL, then test fail.
>> 2. if VariableNameSize is 0 or 1, allow the extra return EFI_INVALID_PARAMETER.
>>
>> Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
>> ---
>>   src/uefi/uefirtvariable/uefirtvariable.c | 5 +++--
>>   1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
>> index 0514805..aca0202 100644
>> --- a/src/uefi/uefirtvariable/uefirtvariable.c
>> +++ b/src/uefi/uefirtvariable/uefirtvariable.c
>> @@ -812,8 +812,7 @@ static int getnextvariable_test4(fwts_framework *fw)
>>   		goto err;
>>   	}
>>
>> -	/* No first result can be 0 or 1 byte in size. */
>> -	for (i = 0; i < 2; i++) {
>> +	for (i = 0; i < 3; i++) {
>>   		variablenamesize = i;
>>   		getnextvariablename.VariableNameSize = &variablenamesize;
>>
>> @@ -831,6 +830,8 @@ static int getnextvariable_test4(fwts_framework *fw)
>>   		 * EFI_NOT_FOUND at this point.
>>   		 */
>>   		if (ioret != -1 || status != EFI_BUFFER_TOO_SMALL) {
>> +			if (i != 2 && status == EFI_INVALID_PARAMETER)
>> +				continue;
>>   			fwts_failed(fw, LOG_LEVEL_HIGH,
>>   				"UEFIRuntimeGetNextVariableName",
>>   				"Expected EFI_BUFFER_TOO_SMALL with small "
>>
> Given that the spec is not clear, this seems like the best approach.
>
> Acked-by: Colin Ian King <colin.king@canonical.com>
>

Acked-by: Alex Hung <alex.hung@canonical.com>
diff mbox

Patch

diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
index 0514805..aca0202 100644
--- a/src/uefi/uefirtvariable/uefirtvariable.c
+++ b/src/uefi/uefirtvariable/uefirtvariable.c
@@ -812,8 +812,7 @@  static int getnextvariable_test4(fwts_framework *fw)
 		goto err;
 	}
 
-	/* No first result can be 0 or 1 byte in size. */
-	for (i = 0; i < 2; i++) {
+	for (i = 0; i < 3; i++) {
 		variablenamesize = i;
 		getnextvariablename.VariableNameSize = &variablenamesize;
 
@@ -831,6 +830,8 @@  static int getnextvariable_test4(fwts_framework *fw)
 		 * EFI_NOT_FOUND at this point.
 		 */
 		if (ioret != -1 || status != EFI_BUFFER_TOO_SMALL) {
+			if (i != 2 && status == EFI_INVALID_PARAMETER)
+				continue;
 			fwts_failed(fw, LOG_LEVEL_HIGH,
 				"UEFIRuntimeGetNextVariableName",
 				"Expected EFI_BUFFER_TOO_SMALL with small "