diff mbox

uefi: uefirtmisc: Add null count argument check for GetNextHighMonotonicCount

Message ID 1427127107-27484-1-git-send-email-colin.king@canonical.com
State Accepted
Headers show

Commit Message

Colin Ian King March 23, 2015, 4:11 p.m. UTC
From: Colin Ian King <colin.king@canonical.com>

Add a simple test for NULL count argumenent being passed into
the run time service GetNextHighMonotonicCount

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 efi_runtime/efi_runtime.c        |  9 ++++++---
 src/uefi/uefirtmisc/uefirtmisc.c | 28 ++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 3 deletions(-)

Comments

Alex Hung March 25, 2015, 3:12 a.m. UTC | #1
On 03/24/2015 12:11 AM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Add a simple test for NULL count argumenent being passed into
> the run time service GetNextHighMonotonicCount
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>  efi_runtime/efi_runtime.c        |  9 ++++++---
>  src/uefi/uefirtmisc/uefirtmisc.c | 28 ++++++++++++++++++++++++++++
>  2 files changed, 34 insertions(+), 3 deletions(-)
> 
> diff --git a/efi_runtime/efi_runtime.c b/efi_runtime/efi_runtime.c
> index 638a817..31e5bb3 100644
> --- a/efi_runtime/efi_runtime.c
> +++ b/efi_runtime/efi_runtime.c
> @@ -534,16 +534,19 @@ static long efi_runtime_get_nexthighmonocount(unsigned long arg)
>  	pgetnexthighmonotoniccount = (struct
>  			efi_getnexthighmonotoniccount __user *)arg;
>  
> -	status = efi.get_next_high_mono_count(&count);
> -
>  	if (copy_from_user(&pgetnexthighmonotoniccount_local,
>  			   pgetnexthighmonotoniccount,
>  			   sizeof(pgetnexthighmonotoniccount_local)))
>  		return -EFAULT;
> +
> +	status = efi.get_next_high_mono_count(
> +		pgetnexthighmonotoniccount_local.HighCount ? &count : NULL);
> +
>  	if (put_user(status, pgetnexthighmonotoniccount_local.status))
>  		return -EFAULT;
>  
> -	if (put_user(count, pgetnexthighmonotoniccount_local.HighCount))
> +	if (pgetnexthighmonotoniccount_local.HighCount &&
> +	    put_user(count, pgetnexthighmonotoniccount_local.HighCount))
>  		return -EFAULT;
>  
>  	if (status != EFI_SUCCESS)
> diff --git a/src/uefi/uefirtmisc/uefirtmisc.c b/src/uefi/uefirtmisc/uefirtmisc.c
> index 91d7540..ab8b6c1 100644
> --- a/src/uefi/uefirtmisc/uefirtmisc.c
> +++ b/src/uefi/uefirtmisc/uefirtmisc.c
> @@ -211,9 +211,37 @@ static int uefirtmisc_test2(fwts_framework *fw)
>  	return FWTS_OK;
>  }
>  
> +static int uefirtmisc_test3(fwts_framework *fw)
> +{
> +	uint64_t status;
> +	long ioret;
> +	struct efi_getnexthighmonotoniccount getnexthighmonotoniccount;
> +
> +	getnexthighmonotoniccount.HighCount = NULL;
> +	getnexthighmonotoniccount.status = &status;
> +
> +	ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTHIGHMONOTONICCOUNT, &getnexthighmonotoniccount);
> +	if (ioret == -1) {
> +		if (status == EFI_INVALID_PARAMETER) {
> +			fwts_passed(fw, "Test with invalid NULL parameter returned "
> +				"EFI_INVALID_PARAMETER as expected.");
> +			return FWTS_OK;
> +		}
> +		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextHighMonotonicCountInvalid",
> +			"Failed to get correct return status from UEFI runtime service, expecting EFI_INVALID_PARAMETER.");
> +		fwts_uefi_print_status_info(fw, status);
> +		return FWTS_ERROR;
> +	}
> +	fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextHighMonotonicCountInvalid",
> +		"Failed to get error return status from UEFI runtime service, expected EFI_INAVLID_PARAMETER.");
> +	return FWTS_ERROR;
> +}
> +
> +
>  static fwts_framework_minor_test uefirtmisc_tests[] = {
>  	{ uefirtmisc_test1, "Test for UEFI miscellaneous runtime service interfaces." },
>  	{ uefirtmisc_test2, "Stress test for UEFI miscellaneous runtime service interfaces." },
> +	{ uefirtmisc_test3, "Test GetNextHighMonotonicCount with invalid NULL parameter." },
>  	{ NULL, NULL }
>  };
>  
> 

Acked-by: Alex Hung <alex.hung@canonical.com>
Ivan Hu March 25, 2015, 6:14 a.m. UTC | #2
On 2015年03月24日 00:11, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> Add a simple test for NULL count argumenent being passed into
> the run time service GetNextHighMonotonicCount
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   efi_runtime/efi_runtime.c        |  9 ++++++---
>   src/uefi/uefirtmisc/uefirtmisc.c | 28 ++++++++++++++++++++++++++++
>   2 files changed, 34 insertions(+), 3 deletions(-)
>
> diff --git a/efi_runtime/efi_runtime.c b/efi_runtime/efi_runtime.c
> index 638a817..31e5bb3 100644
> --- a/efi_runtime/efi_runtime.c
> +++ b/efi_runtime/efi_runtime.c
> @@ -534,16 +534,19 @@ static long efi_runtime_get_nexthighmonocount(unsigned long arg)
>   	pgetnexthighmonotoniccount = (struct
>   			efi_getnexthighmonotoniccount __user *)arg;
>   
> -	status = efi.get_next_high_mono_count(&count);
> -
>   	if (copy_from_user(&pgetnexthighmonotoniccount_local,
>   			   pgetnexthighmonotoniccount,
>   			   sizeof(pgetnexthighmonotoniccount_local)))
>   		return -EFAULT;
> +
> +	status = efi.get_next_high_mono_count(
> +		pgetnexthighmonotoniccount_local.HighCount ? &count : NULL);
> +
>   	if (put_user(status, pgetnexthighmonotoniccount_local.status))
>   		return -EFAULT;
>   
> -	if (put_user(count, pgetnexthighmonotoniccount_local.HighCount))
> +	if (pgetnexthighmonotoniccount_local.HighCount &&
> +	    put_user(count, pgetnexthighmonotoniccount_local.HighCount))
>   		return -EFAULT;
>   
>   	if (status != EFI_SUCCESS)
> diff --git a/src/uefi/uefirtmisc/uefirtmisc.c b/src/uefi/uefirtmisc/uefirtmisc.c
> index 91d7540..ab8b6c1 100644
> --- a/src/uefi/uefirtmisc/uefirtmisc.c
> +++ b/src/uefi/uefirtmisc/uefirtmisc.c
> @@ -211,9 +211,37 @@ static int uefirtmisc_test2(fwts_framework *fw)
>   	return FWTS_OK;
>   }
>   
> +static int uefirtmisc_test3(fwts_framework *fw)
> +{
> +	uint64_t status;
> +	long ioret;
> +	struct efi_getnexthighmonotoniccount getnexthighmonotoniccount;
> +
> +	getnexthighmonotoniccount.HighCount = NULL;
> +	getnexthighmonotoniccount.status = &status;
> +
> +	ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTHIGHMONOTONICCOUNT, &getnexthighmonotoniccount);
> +	if (ioret == -1) {
> +		if (status == EFI_INVALID_PARAMETER) {
> +			fwts_passed(fw, "Test with invalid NULL parameter returned "
> +				"EFI_INVALID_PARAMETER as expected.");
> +			return FWTS_OK;
> +		}
> +		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextHighMonotonicCountInvalid",
> +			"Failed to get correct return status from UEFI runtime service, expecting EFI_INVALID_PARAMETER.");
> +		fwts_uefi_print_status_info(fw, status);
> +		return FWTS_ERROR;
> +	}
> +	fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextHighMonotonicCountInvalid",
> +		"Failed to get error return status from UEFI runtime service, expected EFI_INAVLID_PARAMETER.");
> +	return FWTS_ERROR;
> +}
> +
> +
>   static fwts_framework_minor_test uefirtmisc_tests[] = {
>   	{ uefirtmisc_test1, "Test for UEFI miscellaneous runtime service interfaces." },
>   	{ uefirtmisc_test2, "Stress test for UEFI miscellaneous runtime service interfaces." },
> +	{ uefirtmisc_test3, "Test GetNextHighMonotonicCount with invalid NULL parameter." },
>   	{ NULL, NULL }
>   };
>   
Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff mbox

Patch

diff --git a/efi_runtime/efi_runtime.c b/efi_runtime/efi_runtime.c
index 638a817..31e5bb3 100644
--- a/efi_runtime/efi_runtime.c
+++ b/efi_runtime/efi_runtime.c
@@ -534,16 +534,19 @@  static long efi_runtime_get_nexthighmonocount(unsigned long arg)
 	pgetnexthighmonotoniccount = (struct
 			efi_getnexthighmonotoniccount __user *)arg;
 
-	status = efi.get_next_high_mono_count(&count);
-
 	if (copy_from_user(&pgetnexthighmonotoniccount_local,
 			   pgetnexthighmonotoniccount,
 			   sizeof(pgetnexthighmonotoniccount_local)))
 		return -EFAULT;
+
+	status = efi.get_next_high_mono_count(
+		pgetnexthighmonotoniccount_local.HighCount ? &count : NULL);
+
 	if (put_user(status, pgetnexthighmonotoniccount_local.status))
 		return -EFAULT;
 
-	if (put_user(count, pgetnexthighmonotoniccount_local.HighCount))
+	if (pgetnexthighmonotoniccount_local.HighCount &&
+	    put_user(count, pgetnexthighmonotoniccount_local.HighCount))
 		return -EFAULT;
 
 	if (status != EFI_SUCCESS)
diff --git a/src/uefi/uefirtmisc/uefirtmisc.c b/src/uefi/uefirtmisc/uefirtmisc.c
index 91d7540..ab8b6c1 100644
--- a/src/uefi/uefirtmisc/uefirtmisc.c
+++ b/src/uefi/uefirtmisc/uefirtmisc.c
@@ -211,9 +211,37 @@  static int uefirtmisc_test2(fwts_framework *fw)
 	return FWTS_OK;
 }
 
+static int uefirtmisc_test3(fwts_framework *fw)
+{
+	uint64_t status;
+	long ioret;
+	struct efi_getnexthighmonotoniccount getnexthighmonotoniccount;
+
+	getnexthighmonotoniccount.HighCount = NULL;
+	getnexthighmonotoniccount.status = &status;
+
+	ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTHIGHMONOTONICCOUNT, &getnexthighmonotoniccount);
+	if (ioret == -1) {
+		if (status == EFI_INVALID_PARAMETER) {
+			fwts_passed(fw, "Test with invalid NULL parameter returned "
+				"EFI_INVALID_PARAMETER as expected.");
+			return FWTS_OK;
+		}
+		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextHighMonotonicCountInvalid",
+			"Failed to get correct return status from UEFI runtime service, expecting EFI_INVALID_PARAMETER.");
+		fwts_uefi_print_status_info(fw, status);
+		return FWTS_ERROR;
+	}
+	fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextHighMonotonicCountInvalid",
+		"Failed to get error return status from UEFI runtime service, expected EFI_INAVLID_PARAMETER.");
+	return FWTS_ERROR;
+}
+
+
 static fwts_framework_minor_test uefirtmisc_tests[] = {
 	{ uefirtmisc_test1, "Test for UEFI miscellaneous runtime service interfaces." },
 	{ uefirtmisc_test2, "Stress test for UEFI miscellaneous runtime service interfaces." },
+	{ uefirtmisc_test3, "Test GetNextHighMonotonicCount with invalid NULL parameter." },
 	{ NULL, NULL }
 };