[PATCH] uefirtvariable: check the return value for cleaning up the enviroment
ivanhu
ivan.hu at canonical.com
Wed Dec 3 09:36:29 UTC 2014
On 2014年12月03日 15:22, Alex Hung wrote:
> 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?
>
The return value of the uefirtvariable_env_cleanup() doesn't need to be
cared.
In normal case, without uefirtvariable_env_cleanup() the test also run well.
These check value codes are added to fix the Coverity Scan warnings.
Most case on fwts the warnings will accompany with FWTS_ERROR. I prefer
log info rather than warnings here.
Any one has comments?
More information about the fwts-devel
mailing list