[PATCH] uefirtvariable: check the return value for cleaning up the enviroment
ivanhu
ivan.hu at canonical.com
Wed Dec 3 09:49:19 UTC 2014
On 2014年12月03日 17:39, Colin Ian King wrote:
> On 03/12/14 09:36, ivanhu wrote:
>> 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?
>>
>>
>>
> If one does not care about checking ioctl() error returns then one could
> just explicitly cast the return to void, e.g.
>
> (void)ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
>
> Note sure how well static analysers handle that. Try than and if
> coverity complains I will handle the exceptions in coverity scan
>
> Colin
>
>
>
Thanks! Colin,
will sent out another patch.
Ivan
More information about the fwts-devel
mailing list