[PATCH] uefirtvariable: check the return value for cleaning up the enviroment
Ivan Hu
ivan.hu at canonical.com
Wed Dec 3 03:20:09 UTC 2014
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;
}
--
1.7.9.5
More information about the fwts-devel
mailing list