[PATCH] uefirtvariable: check the return value for cleaning up the enviroment
Alex Hung
alex.hung at canonical.com
Wed Dec 3 07:22:22 UTC 2014
On 12/03/2014 11:20 AM, Ivan Hu wrote:
> Coverity Scan complains the Unchecked return value for ioctl() calls in
> uefirtvariable_env_cleanup(). The uefirtvariable_env_cleanup() is added to avoid
> some buggy firmware abnormal stop the tests without deleted the test variables.
> Before starting the test, it will try to delete all the test variables. Expected
> return -1 and errno EINVAL when no test variables exist, return 0 when there are
> test variables and deleted sucessfully. Check the return value and log info
> when other errors occur.
>
> Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
> ---
> src/uefi/uefirtvariable/uefirtvariable.c | 26 ++++++++++++++++++++------
> 1 file changed, 20 insertions(+), 6 deletions(-)
>
> diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
> index a19f835..3bb5ca0 100644
> --- a/src/uefi/uefirtvariable/uefirtvariable.c
> +++ b/src/uefi/uefirtvariable/uefirtvariable.c
> @@ -21,6 +21,7 @@
> #include <stdio.h>
> #include <stddef.h>
> #include <sys/ioctl.h>
> +#include <errno.h>
> #include <fcntl.h>
>
> #include "fwts.h"
> @@ -62,8 +63,9 @@ static uint16_t variablenametest[] = {'T', 'e', 's', 't', 'v', 'a', 'r', '\0'};
> static uint16_t variablenametest2[] = {'T', 'e', 's', 't', 'v', 'a', 'r', ' ', '\0'};
> static uint16_t variablenametest3[] = {'T', 'e', 's', 't', 'v', 'a', '\0'};
>
> -static void uefirtvariable_env_cleanup(void)
> +static void uefirtvariable_env_cleanup(fwts_framework *fw)
> {
> + long ioret;
> struct efi_setvariable setvariable;
> uint64_t status;
> uint8_t data = 0;
> @@ -74,17 +76,29 @@ static void uefirtvariable_env_cleanup(void)
> setvariable.DataSize = 0;
> setvariable.Data = &data;
> setvariable.status = &status;
> - ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
> + ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
> + if (ioret == -1 && errno != EINVAL)
> + fwts_log_info(fw, "Got errors when clean up the enviroment, "
> + "but still try to run the tests.");
>
> setvariable.VariableName = variablenametest2;
> - ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
> + ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
> + if (ioret == -1 && errno != EINVAL)
> + fwts_log_info(fw, "Got errors when clean up the enviroment, "
> + "but still try to run the tests.");
>
> setvariable.VariableName = variablenametest3;
> - ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
> + ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
> + if (ioret == -1 && errno != EINVAL)
> + fwts_log_info(fw, "Got errors when clean up the enviroment, "
> + "but still try to run the tests.");
>
> setvariable.VariableName = variablenametest;
> setvariable.VendorGuid = >estguid2;
> - ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
> + ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
> + if (ioret == -1 && errno != EINVAL)
> + fwts_log_info(fw, "Got errors when clean up the enviroment, "
> + "but still try to run the tests.");
> }
>
> static int uefirtvariable_init(fwts_framework *fw)
> @@ -105,7 +119,7 @@ static int uefirtvariable_init(fwts_framework *fw)
> return FWTS_ABORTED;
> }
>
> - uefirtvariable_env_cleanup();
> + uefirtvariable_env_cleanup(fw);
>
> return FWTS_OK;
> }
>
Since errors are returned, will it be better if warnings are used instead?
--
Cheers,
Alex Hung
More information about the fwts-devel
mailing list