ACK: [PATCH 3/3] uefirtvariable: Test GetNextVariableName() error handling

Colin Ian King colin.king at canonical.com
Tue Mar 5 22:17:53 UTC 2013


On 05/03/13 21:54, Matt Fleming wrote:
> From: Matt Fleming <matt.fleming at intel.com>
>
> The spec is pretty clear about what status codes should be returned
> when passing bogus parameters to GetNextVariableName(), such as a NULL
> pointer for VariableName returning EFI_INVALID_PARAMETER. Make sure we
> see the status codes we expect.
>
> Also, check to see that VariableNameSize is updated with the size of
> the data buffer required to hold VariableName when GetNextVariableName()
> returns EFI_BUFFER_TOO_SMALL.
>
> Signed-off-by: Matt Fleming <matt.fleming at intel.com>
> ---
>   src/uefi/uefirtvariable/uefirtvariable.c | 93 ++++++++++++++++++++++++++++++++
>   1 file changed, 93 insertions(+)
>
> diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
> index fe4cdce..c8f0911 100644
> --- a/src/uefi/uefirtvariable/uefirtvariable.c
> +++ b/src/uefi/uefirtvariable/uefirtvariable.c
> @@ -556,6 +556,95 @@ err:
>   	return FWTS_ERROR;
>   }
>
> +static int getnextvariable_test4(fwts_framework *fw)
> +{
> +	long ioret;
> +	uint64_t status;
> +	uint64_t i;
> +
> +	struct efi_getnextvariablename getnextvariablename;
> +	uint64_t variablenamesize = MAX_DATA_LENGTH;
> +	uint16_t variablename[MAX_DATA_LENGTH];
> +	EFI_GUID vendorguid;
> +
> +	getnextvariablename.VariableNameSize = &variablenamesize;
> +	getnextvariablename.VendorGuid = &vendorguid;
> +	getnextvariablename.status = &status;
> +
> +	/*
> +	 * Check for expected error values.
> +	 */
> +	getnextvariablename.VariableName = NULL;
> +
> +	ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
> +
> +	if (ioret != -1 || status != EFI_INVALID_PARAMETER) {
> +		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextVariableName",
> +			"Expected EFI_INVALID_PARAMETER with NULL VariableName.");
> +		fwts_uefi_print_status_info(fw, status);
> +		goto err;
> +	}
> +
> +	getnextvariablename.VariableName = variablename;
> +	getnextvariablename.VendorGuid = NULL;
> +
> +	ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
> +
> +	if (ioret != -1 || status != EFI_INVALID_PARAMETER) {
> +		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextVariableName",
> +			"Expected EFI_INVALID_PARAMETER with NULL VendorGuid.");
> +		fwts_uefi_print_status_info(fw, status);
> +		goto err;
> +	}
> +
> +	getnextvariablename.VendorGuid = &vendorguid;
> +	getnextvariablename.VariableNameSize = NULL;
> +
> +	ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
> +
> +	if (ioret != -1 || status != EFI_INVALID_PARAMETER) {
> +		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextVariableName",
> +			"Expected EFI_INVALID_PARAMETER with NULL VariableNameSize.");
> +		fwts_uefi_print_status_info(fw, status);
> +		goto err;
> +	}
> +
> +	/* No first result can be 0 or 1 byte in size. */
> +	for (i = 0; i < 2; i++) {
> +		variablenamesize = i;
> +		getnextvariablename.VariableNameSize = &variablenamesize;
> +
> +		/* To start the search, need to pass a Null-terminated string in VariableName */
> +		variablename[0] = '\0';
> +
> +		ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
> +
> +		/*
> +		 * We expect this machine to have at least some UEFI
> +		 * variables, which is the reason we don't check for
> +		 * EFI_NOT_FOUND at this point.
> +		 */
> +		if (ioret != -1 || status != EFI_BUFFER_TOO_SMALL) {
> +			fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextVariableName",
> +				"Expected EFI_BUFFER_TOO_SMALL with small VariableNameSize.");
> +			fwts_uefi_print_status_info(fw, status);
> +			goto err;
> +		}
> +
> +		/* Has the firmware failed to update the variable size? */
> +		if (variablenamesize == i) {
> +			fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextVariableName",
> +				    "EFI_BUFFER_TOO_SMALL VariableNameSize was not updated.");
> +			goto err;
> +		}
> +	}
> +
> +	return FWTS_OK;
> +
> +err:
> +	return FWTS_ERROR;
> +}
> +
>   static int setvariable_insertvariable(fwts_framework *fw, uint32_t attributes, uint64_t datasize,
>   					uint16_t *varname, EFI_GUID *gtestguid, uint8_t datadiff)
>   {
> @@ -1086,6 +1175,10 @@ static int uefirtvariable_test2(fwts_framework *fw)
>   	if (ret != FWTS_OK)
>   		return ret;
>
> +	ret = getnextvariable_test4(fw);
> +	if (ret != FWTS_OK)
> +		return ret;
> +
>   	fwts_passed(fw, "UEFI runtime service GetNextVariableName interface test passed.");
>
>   	return FWTS_OK;
>
Acked-by: Colin Ian King <colin.king at canonical.com>



More information about the fwts-devel mailing list