diff mbox

uefirtvariable: add function test for SetVariable with invalid attributes

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

Commit Message

Ivan Hu Dec. 18, 2012, 9:58 a.m. UTC
Add the function test for Setvariable with the attribute,
EFI_VARIABLE_BOOTSERVICE_ACCESS
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS
the SetVariable setting with these attributes should not work sucessfully,
after the ExitBootServices() is performed.
this test will check the return value for the SetVariable and
check the variable is actually set or not by GetVariable.
If the variable is found, that means firmware might have some implement
issue, the test fail.

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

Comments

Colin Ian King Dec. 19, 2012, 11:03 a.m. UTC | #1
On 18/12/12 09:58, Ivan Hu wrote:
> Add the function test for Setvariable with the attribute,
> EFI_VARIABLE_BOOTSERVICE_ACCESS
> EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE
> EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS
> the SetVariable setting with these attributes should not work sucessfully,
> after the ExitBootServices() is performed.
> this test will check the return value for the SetVariable and
> check the variable is actually set or not by GetVariable.
> If the variable is found, that means firmware might have some implement
> issue, the test fail.
>
> Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
> ---
>   src/uefi/uefirtvariable/uefirtvariable.c |   58 ++++++++++++++++++++++++++++++
>   1 file changed, 58 insertions(+)
>
> diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
> index cb446fd..6b1d869 100644
> --- a/src/uefi/uefirtvariable/uefirtvariable.c
> +++ b/src/uefi/uefirtvariable/uefirtvariable.c
> @@ -406,6 +406,35 @@ static int setvariable_checkvariable_notfound(fwts_framework *fw, uint16_t *varn
>   	return FWTS_ERROR;
>   }
>
> +static int setvariable_invalidattr(fwts_framework *fw, uint32_t attributes, uint64_t datasize,
> +					uint16_t *varname, EFI_GUID *gtestguid, uint8_t datadiff)
> +{
> +	struct efi_setvariable setvariable;
> +	uint64_t status;
> +	uint64_t dataindex;
> +	uint8_t data[datasize+1];
> +
> +	for (dataindex = 0; dataindex < datasize; dataindex++)
> +		data[dataindex] = (uint8_t)dataindex + datadiff;
> +	data[dataindex] = '\0';
> +
> +	setvariable.VariableName = varname;
> +	setvariable.VendorGuid = gtestguid;
> +	setvariable.Attributes = attributes;
> +	setvariable.DataSize = datasize;
> +	setvariable.Data = data;
> +	setvariable.status = &status;
> +
> +	ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
> +
> +	if (status == EFI_SUCCESS) {
> +		fwts_warning(fw, "After ExitBootServices() is performed, the attributes %" PRIu32 ", "
> +			"for SetVariable shouldn't be set successfully.", attributes);
> +		return FWTS_ERROR;
> +	}
> +	return FWTS_OK;
> +}
> +
>   static int setvariable_test1(fwts_framework *fw, uint64_t datasize1,
>   							uint64_t datasize2, uint16_t *varname)
>   {
> @@ -577,6 +606,30 @@ static int setvariable_test5(fwts_framework *fw)
>   	return FWTS_OK;
>   }
>
> +static int setvariable_test6(fwts_framework *fw)
> +{
> +	uint64_t datasize = 10;
> +	uint8_t datadiff = 0;
> +	uint32_t attributesarray[] = {  FWTS_UEFI_VAR_BOOTSERVICE_ACCESS,
> +					FWTS_UEFI_VAR_NON_VOLATILE | FWTS_UEFI_VAR_BOOTSERVICE_ACCESS,
> +					FWTS_UEFI_VAR_BOOTSERVICE_ACCESS | FWTS_UEFI_VAR_RUNTIME_ACCESS };
> +	uint64_t index;
> +
> +	for (index = 0; index < (sizeof(attributesarray)/(sizeof attributesarray[0])); index++) {
> +		setvariable_invalidattr(fw, attributesarray[index], datasize, variablenametest, &gtestguid1, datadiff);
> +
> +		if (setvariable_checkvariable_notfound(fw, variablenametest, &gtestguid1) == FWTS_ERROR) {
> +			fwts_log_info(fw, "Get the variable which is set by SetVariable with invalid attribute %"
> +				PRIu32 " after ExitBootServices() is performed, "
> +				"test failed.", attributesarray[index]);
> +			setvariable_insertvariable(fw, 0, datasize, variablenametest, &gtestguid1, datadiff);
> +			return FWTS_ERROR;
> +		}
> +	}
> +
> +	return FWTS_OK;
> +}
> +
>   static int uefirtvariable_test1(fwts_framework *fw)
>   {
>   	uint64_t datasize = 10;
> @@ -628,6 +681,11 @@ static int uefirtvariable_test3(fwts_framework *fw)
>   		return FWTS_ERROR;
>   	fwts_passed(fw, "SetVariable on Attributes is 0 passed.");
>
> +	fwts_log_info(fw, "Testing SetVariable on Invalid Attributes.");
> +	if (setvariable_test6(fw) == FWTS_ERROR)
> +		return FWTS_ERROR;
> +	fwts_passed(fw, "SetVariable on Invalid Attributes passed.");
> +
>   	return FWTS_OK;
>   }
>
>

That's great. Let's see if we get any firmware bugs with this :-)

Acked-by: Colin Ian King <colin.king@canonical.com>
Keng-Yu Lin Dec. 21, 2012, 7:54 a.m. UTC | #2
On Tue, Dec 18, 2012 at 5:58 PM, Ivan Hu <ivan.hu@canonical.com> wrote:
> Add the function test for Setvariable with the attribute,
> EFI_VARIABLE_BOOTSERVICE_ACCESS
> EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE
> EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS
> the SetVariable setting with these attributes should not work sucessfully,
> after the ExitBootServices() is performed.
> this test will check the return value for the SetVariable and
> check the variable is actually set or not by GetVariable.
> If the variable is found, that means firmware might have some implement
> issue, the test fail.
>
> Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
> ---
>  src/uefi/uefirtvariable/uefirtvariable.c |   58 ++++++++++++++++++++++++++++++
>  1 file changed, 58 insertions(+)
>
> diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
> index cb446fd..6b1d869 100644
> --- a/src/uefi/uefirtvariable/uefirtvariable.c
> +++ b/src/uefi/uefirtvariable/uefirtvariable.c
> @@ -406,6 +406,35 @@ static int setvariable_checkvariable_notfound(fwts_framework *fw, uint16_t *varn
>         return FWTS_ERROR;
>  }
>
> +static int setvariable_invalidattr(fwts_framework *fw, uint32_t attributes, uint64_t datasize,
> +                                       uint16_t *varname, EFI_GUID *gtestguid, uint8_t datadiff)
> +{
> +       struct efi_setvariable setvariable;
> +       uint64_t status;
> +       uint64_t dataindex;
> +       uint8_t data[datasize+1];
> +
> +       for (dataindex = 0; dataindex < datasize; dataindex++)
> +               data[dataindex] = (uint8_t)dataindex + datadiff;
> +       data[dataindex] = '\0';
> +
> +       setvariable.VariableName = varname;
> +       setvariable.VendorGuid = gtestguid;
> +       setvariable.Attributes = attributes;
> +       setvariable.DataSize = datasize;
> +       setvariable.Data = data;
> +       setvariable.status = &status;
> +
> +       ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
> +
> +       if (status == EFI_SUCCESS) {
> +               fwts_warning(fw, "After ExitBootServices() is performed, the attributes %" PRIu32 ", "
> +                       "for SetVariable shouldn't be set successfully.", attributes);
> +               return FWTS_ERROR;
> +       }
> +       return FWTS_OK;
> +}
> +
>  static int setvariable_test1(fwts_framework *fw, uint64_t datasize1,
>                                                         uint64_t datasize2, uint16_t *varname)
>  {
> @@ -577,6 +606,30 @@ static int setvariable_test5(fwts_framework *fw)
>         return FWTS_OK;
>  }
>
> +static int setvariable_test6(fwts_framework *fw)
> +{
> +       uint64_t datasize = 10;
> +       uint8_t datadiff = 0;
> +       uint32_t attributesarray[] = {  FWTS_UEFI_VAR_BOOTSERVICE_ACCESS,
> +                                       FWTS_UEFI_VAR_NON_VOLATILE | FWTS_UEFI_VAR_BOOTSERVICE_ACCESS,
> +                                       FWTS_UEFI_VAR_BOOTSERVICE_ACCESS | FWTS_UEFI_VAR_RUNTIME_ACCESS };
> +       uint64_t index;
> +
> +       for (index = 0; index < (sizeof(attributesarray)/(sizeof attributesarray[0])); index++) {
> +               setvariable_invalidattr(fw, attributesarray[index], datasize, variablenametest, &gtestguid1, datadiff);
> +
> +               if (setvariable_checkvariable_notfound(fw, variablenametest, &gtestguid1) == FWTS_ERROR) {
> +                       fwts_log_info(fw, "Get the variable which is set by SetVariable with invalid attribute %"
> +                               PRIu32 " after ExitBootServices() is performed, "
> +                               "test failed.", attributesarray[index]);
> +                       setvariable_insertvariable(fw, 0, datasize, variablenametest, &gtestguid1, datadiff);
> +                       return FWTS_ERROR;
> +               }
> +       }
> +
> +       return FWTS_OK;
> +}
> +
>  static int uefirtvariable_test1(fwts_framework *fw)
>  {
>         uint64_t datasize = 10;
> @@ -628,6 +681,11 @@ static int uefirtvariable_test3(fwts_framework *fw)
>                 return FWTS_ERROR;
>         fwts_passed(fw, "SetVariable on Attributes is 0 passed.");
>
> +       fwts_log_info(fw, "Testing SetVariable on Invalid Attributes.");
> +       if (setvariable_test6(fw) == FWTS_ERROR)
> +               return FWTS_ERROR;
> +       fwts_passed(fw, "SetVariable on Invalid Attributes passed.");
> +
>         return FWTS_OK;
>  }
>
> --
> 1.7.10.4
>
Acked-by: Keng-Yu Lin <kengyu@canonical.com>
diff mbox

Patch

diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
index cb446fd..6b1d869 100644
--- a/src/uefi/uefirtvariable/uefirtvariable.c
+++ b/src/uefi/uefirtvariable/uefirtvariable.c
@@ -406,6 +406,35 @@  static int setvariable_checkvariable_notfound(fwts_framework *fw, uint16_t *varn
 	return FWTS_ERROR;
 }
 
+static int setvariable_invalidattr(fwts_framework *fw, uint32_t attributes, uint64_t datasize,
+					uint16_t *varname, EFI_GUID *gtestguid, uint8_t datadiff)
+{
+	struct efi_setvariable setvariable;
+	uint64_t status;
+	uint64_t dataindex;
+	uint8_t data[datasize+1];
+
+	for (dataindex = 0; dataindex < datasize; dataindex++)
+		data[dataindex] = (uint8_t)dataindex + datadiff;
+	data[dataindex] = '\0';
+
+	setvariable.VariableName = varname;
+	setvariable.VendorGuid = gtestguid;
+	setvariable.Attributes = attributes;
+	setvariable.DataSize = datasize;
+	setvariable.Data = data;
+	setvariable.status = &status;
+
+	ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
+
+	if (status == EFI_SUCCESS) {
+		fwts_warning(fw, "After ExitBootServices() is performed, the attributes %" PRIu32 ", "
+			"for SetVariable shouldn't be set successfully.", attributes);
+		return FWTS_ERROR;
+	}
+	return FWTS_OK;
+}
+
 static int setvariable_test1(fwts_framework *fw, uint64_t datasize1,
 							uint64_t datasize2, uint16_t *varname)
 {
@@ -577,6 +606,30 @@  static int setvariable_test5(fwts_framework *fw)
 	return FWTS_OK;
 }
 
+static int setvariable_test6(fwts_framework *fw)
+{
+	uint64_t datasize = 10;
+	uint8_t datadiff = 0;
+	uint32_t attributesarray[] = {  FWTS_UEFI_VAR_BOOTSERVICE_ACCESS,
+					FWTS_UEFI_VAR_NON_VOLATILE | FWTS_UEFI_VAR_BOOTSERVICE_ACCESS,
+					FWTS_UEFI_VAR_BOOTSERVICE_ACCESS | FWTS_UEFI_VAR_RUNTIME_ACCESS };
+	uint64_t index;
+
+	for (index = 0; index < (sizeof(attributesarray)/(sizeof attributesarray[0])); index++) {
+		setvariable_invalidattr(fw, attributesarray[index], datasize, variablenametest, &gtestguid1, datadiff);
+
+		if (setvariable_checkvariable_notfound(fw, variablenametest, &gtestguid1) == FWTS_ERROR) {
+			fwts_log_info(fw, "Get the variable which is set by SetVariable with invalid attribute %"
+				PRIu32 " after ExitBootServices() is performed, "
+				"test failed.", attributesarray[index]);
+			setvariable_insertvariable(fw, 0, datasize, variablenametest, &gtestguid1, datadiff);
+			return FWTS_ERROR;
+		}
+	}
+
+	return FWTS_OK;
+}
+
 static int uefirtvariable_test1(fwts_framework *fw)
 {
 	uint64_t datasize = 10;
@@ -628,6 +681,11 @@  static int uefirtvariable_test3(fwts_framework *fw)
 		return FWTS_ERROR;
 	fwts_passed(fw, "SetVariable on Attributes is 0 passed.");
 
+	fwts_log_info(fw, "Testing SetVariable on Invalid Attributes.");
+	if (setvariable_test6(fw) == FWTS_ERROR)
+		return FWTS_ERROR;
+	fwts_passed(fw, "SetVariable on Invalid Attributes passed.");
+
 	return FWTS_OK;
 }