[PATCH 1/2] uefi: clean and check status with magic value ~0ULL (LP: #1784365)
Ivan Hu
ivan.hu at canonical.com
Tue Aug 7 11:18:24 UTC 2018
This patch add the clean the status value to ~0ULL, which is not define on UEFI
Spec., can safely be used to avoid some wrong staus reports and false alarms.
Also add the checking of staus of value ~0ULL on
fwts_uefi_print_status_info function.
Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
---
src/lib/src/fwts_uefi.c | 7 ++++++
src/uefi/securebootcert/securebootcert.c | 2 +-
src/uefi/uefirtauthvar/uefirtauthvar.c | 2 ++
src/uefi/uefirtmisc/uefirtmisc.c | 5 ++--
src/uefi/uefirttime/uefirttime.c | 29 ++++++++++++++--------
src/uefi/uefirtvariable/uefirtvariable.c | 42 ++++++++++++++++++++++++--------
src/uefi/uefivarinfo/uefivarinfo.c | 5 ++++
7 files changed, 69 insertions(+), 23 deletions(-)
diff --git a/src/lib/src/fwts_uefi.c b/src/lib/src/fwts_uefi.c
index e200904..f719466 100644
--- a/src/lib/src/fwts_uefi.c
+++ b/src/lib/src/fwts_uefi.c
@@ -27,6 +27,8 @@
#include <dirent.h>
#include <stdint.h>
#include <inttypes.h>
+#include <errno.h>
+#include <string.h>
#include "fwts.h"
#include "fwts_uefi.h"
@@ -468,6 +470,11 @@ void fwts_uefi_print_status_info(fwts_framework *fw, const uint64_t status)
const uefistatus_info *info;
+ if (status == ~0ULL) {
+ fwts_log_info(fw, "fwts test ioctl() failed, errno=%d (%s)", errno, strerror(errno));
+ return;
+ }
+
for (info = uefistatus_info_table; info->mnemonic != NULL; info++) {
if (status == info->statusvalue) {
fwts_log_info(fw, "Return status: %s. %s", info->mnemonic, info->description);
diff --git a/src/uefi/securebootcert/securebootcert.c b/src/uefi/securebootcert/securebootcert.c
index f1161d6..41712a7 100644
--- a/src/uefi/securebootcert/securebootcert.c
+++ b/src/uefi/securebootcert/securebootcert.c
@@ -525,7 +525,7 @@ static int securebootcert_setvar(
long ioret;
struct efi_setvariable setvariable;
- uint64_t status;
+ uint64_t status = ~0ULL;
uint64_t datasize = 1;
setvariable.VariableName = varname;
diff --git a/src/uefi/uefirtauthvar/uefirtauthvar.c b/src/uefi/uefirtauthvar/uefirtauthvar.c
index 7384ae3..c59b087 100644
--- a/src/uefi/uefirtauthvar/uefirtauthvar.c
+++ b/src/uefi/uefirtauthvar/uefirtauthvar.c
@@ -70,6 +70,7 @@ static long setvar(
setvariable.DataSize = datasize;
setvariable.Data = data;
setvariable.status = status;
+ *status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
return ioret;
@@ -91,6 +92,7 @@ static long getvar(
getvariable.DataSize = getdatasize;
getvariable.Data = data;
getvariable.status = status;
+ *status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
return ioret;
diff --git a/src/uefi/uefirtmisc/uefirtmisc.c b/src/uefi/uefirtmisc/uefirtmisc.c
index 7faa910..5679d26 100644
--- a/src/uefi/uefirtmisc/uefirtmisc.c
+++ b/src/uefi/uefirtmisc/uefirtmisc.c
@@ -85,6 +85,7 @@ static int getnexthighmonotoniccount_test(fwts_framework *fw, uint32_t multitest
getnexthighmonotoniccount.status = &status;
for (i = 0; i < multitesttime; i++) {
+ status = ~0ULL;
long ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTHIGHMONOTONICCOUNT, &getnexthighmonotoniccount);
if (ioret == -1) {
@@ -124,8 +125,8 @@ static int querycapsulecapabilities_test(fwts_framework *fw, uint32_t multitestt
querycapsulecapabilities.ResetType = &resettype;
for (i = 0; i < multitesttime; i++) {
+ status = ~0ULL;
long ioret = ioctl(fd, EFI_RUNTIME_QUERY_CAPSULECAPABILITIES, &querycapsulecapabilities);
-
if (ioret == -1) {
if (status == EFI_UNSUPPORTED) {
fwts_skipped(fw, "Not support the UEFI QueryCapsuleCapabilities runtime interface"
@@ -219,7 +220,7 @@ static int uefirtmisc_test2(fwts_framework *fw)
static int uefirtmisc_test3(fwts_framework *fw)
{
- uint64_t status;
+ uint64_t status = ~0ULL;
long ioret;
struct efi_getnexthighmonotoniccount getnexthighmonotoniccount;
diff --git a/src/uefi/uefirttime/uefirttime.c b/src/uefi/uefirttime/uefirttime.c
index ee013a7..be824e6 100644
--- a/src/uefi/uefirttime/uefirttime.c
+++ b/src/uefi/uefirttime/uefirttime.c
@@ -206,7 +206,7 @@ static int uefirttime_test1(fwts_framework *fw)
EFI_TIME efi_time;
EFI_TIME_CAPABILITIES efi_time_cap;
- uint64_t status;
+ uint64_t status = ~0ULL;
gettime.Capabilities = &efi_time_cap;
gettime.Time = &efi_time;
@@ -236,7 +236,7 @@ static int uefirttime_test_gettime_invalid(
{
long ioret;
struct efi_gettime gettime;
- uint64_t status;
+ uint64_t status = ~0ULL;
gettime.Capabilities = efi_time_cap;
gettime.Time = efi_time;
@@ -277,7 +277,7 @@ static int uefirttime_test4(fwts_framework *fw)
long ioret;
struct efi_settime settime;
- uint64_t status;
+ uint64_t status = ~0ULL;
struct efi_gettime gettime;
EFI_TIME oldtime;
@@ -325,6 +325,7 @@ static int uefirttime_test4(fwts_framework *fw)
time.TimeZone = 2047;
settime.Time = &time;
+ status = ~0ULL;
settime.status = &status;
ioret = ioctl(fd, EFI_RUNTIME_SET_TIME, &settime);
@@ -338,6 +339,7 @@ static int uefirttime_test4(fwts_framework *fw)
sleep(1);
gettime.Time = &newtime;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_TIME, &gettime);
@@ -380,6 +382,7 @@ static int uefirttime_test4(fwts_framework *fw)
/* restore the previous time. */
settime.Time = &oldtime;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_SET_TIME, &settime);
if (ioret == -1) {
fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetTime",
@@ -398,7 +401,7 @@ static int uefirttime_test_settime_invalid(
struct efi_settime *settime)
{
long ioret;
- uint64_t status;
+ uint64_t status = ~0ULL;
settime->status = &status;
@@ -427,7 +430,7 @@ static int uefirttime_test_settime_invalid_time(
struct efi_gettime gettime;
struct efi_settime settime;
EFI_TIME oldtime, newtime;
- uint64_t status;
+ uint64_t status = ~0ULL;
int ret, ioret;
gettime.Time = &oldtime;
@@ -467,6 +470,7 @@ static int uefirttime_test_settime_invalid_time(
/* Restore original time */
settime.Time = &oldtime;
+ status = ~0ULL;
settime.status = &status;
ioret = ioctl(fd, EFI_RUNTIME_SET_TIME, &settime);
if (ioret == -1) {
@@ -609,7 +613,7 @@ static int uefirttime_test18(fwts_framework *fw)
{
long ioret;
struct efi_getwakeuptime getwakeuptime;
- uint64_t status;
+ uint64_t status = ~0ULL;
uint8_t enabled, pending;
EFI_TIME efi_time;
@@ -644,7 +648,7 @@ static int uefirttime_test_getwaketime_invalid(
struct efi_getwakeuptime *getwakeuptime)
{
long ioret;
- uint64_t status;
+ uint64_t status = ~0ULL;
getwakeuptime->status = &status;
ioret = ioctl(fd, EFI_RUNTIME_GET_WAKETIME, getwakeuptime);
@@ -722,7 +726,7 @@ static int uefirttime_test23(fwts_framework *fw)
{
long ioret;
struct efi_setwakeuptime setwakeuptime;
- uint64_t status;
+ uint64_t status = ~0ULL;
EFI_TIME oldtime;
EFI_TIME newtime;
@@ -749,6 +753,7 @@ static int uefirttime_test23(fwts_framework *fw)
addonehour(&oldtime);
setwakeuptime.Time = &oldtime;
+ status = ~0ULL;
setwakeuptime.status = &status;
setwakeuptime.Enabled = true;
@@ -770,6 +775,7 @@ static int uefirttime_test23(fwts_framework *fw)
getwakeuptime.Enabled = &enabled;
getwakeuptime.Pending = &pending;
getwakeuptime.Time = &newtime;
+ status = ~0ULL;
getwakeuptime.status = &status;
ioret = ioctl(fd, EFI_RUNTIME_GET_WAKETIME, &getwakeuptime);
@@ -805,6 +811,7 @@ static int uefirttime_test23(fwts_framework *fw)
}
setwakeuptime.Enabled = false;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_SET_WAKETIME, &setwakeuptime);
if (ioret == -1) {
@@ -815,6 +822,7 @@ static int uefirttime_test23(fwts_framework *fw)
}
sleep(1);
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_WAKETIME, &getwakeuptime);
if (ioret == -1) {
@@ -846,7 +854,7 @@ static int uefirttime_test_setwakeuptime_invalid(
)
{
long ioret;
- uint64_t status;
+ uint64_t status = ~0ULL;
setwakeuptime->status = &status;
@@ -890,7 +898,7 @@ static int uefirttime_test_setwakeuptime_invalid_time(
struct efi_getwakeuptime getwakeuptime;
struct efi_setwakeuptime setwakeuptime;
EFI_TIME oldtime, newtime;
- uint64_t status;
+ uint64_t status = ~0ULL;
uint8_t pending, enabled;
int ret, ioret;
@@ -938,6 +946,7 @@ static int uefirttime_test_setwakeuptime_invalid_time(
/* Restore original time */
setwakeuptime.Time = &oldtime;
+ status = ~0ULL;
setwakeuptime.status = &status;
setwakeuptime.Enabled = true;
ioret = ioctl(fd, EFI_RUNTIME_SET_WAKETIME, &setwakeuptime);
diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
index b42240e..552790e 100644
--- a/src/uefi/uefirtvariable/uefirtvariable.c
+++ b/src/uefi/uefirtvariable/uefirtvariable.c
@@ -75,15 +75,19 @@ static void uefirtvariable_env_cleanup(void)
setvariable.Attributes = 0;
setvariable.DataSize = 0;
setvariable.Data = &data;
+ status = ~0ULL;
setvariable.status = &status;
(void)ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
+ status = ~0ULL;
setvariable.VariableName = variablenametest2;
(void)ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
+ status = ~0ULL;
setvariable.VariableName = variablenametest3;
(void)ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
+ status = ~0ULL;
setvariable.VariableName = variablenametest;
setvariable.VendorGuid = >estguid2;
(void)ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
@@ -130,7 +134,7 @@ static int getvariable_test(
struct efi_getvariable getvariable;
struct efi_setvariable setvariable;
- uint64_t status;
+ uint64_t status = ~0ULL;
uint8_t testdata[MAX_DATA_LENGTH];
uint64_t dataindex;
uint64_t getdatasize = sizeof(testdata);
@@ -177,6 +181,7 @@ static int getvariable_test(
getvariable.status = &status;
for (i = 0; i < multitesttime; i++) {
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
if (ioret == -1) {
fwts_failed(fw, LOG_LEVEL_HIGH,
@@ -221,6 +226,7 @@ static int getvariable_test(
/* delete the variable */
setvariable.DataSize = 0;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
@@ -236,6 +242,7 @@ static int getvariable_test(
err_restore_env:
setvariable.DataSize = 0;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
@@ -288,7 +295,7 @@ static bool compare_name(const uint16_t *name1, const uint16_t *name2)
static int getnextvariable_test1(fwts_framework *fw)
{
long ioret;
- uint64_t status;
+ uint64_t status = ~0ULL;
struct efi_setvariable setvariable;
@@ -351,6 +358,7 @@ static int getnextvariable_test1(fwts_framework *fw)
variablename[0] = '\0';
while (true) {
variablenamesize = maxvariablenamesize;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
if (ioret == -1) {
@@ -416,6 +424,7 @@ static int getnextvariable_test1(fwts_framework *fw)
/* delete the variable */
setvariable.DataSize = 0;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
@@ -431,6 +440,7 @@ static int getnextvariable_test1(fwts_framework *fw)
err_restore_env:
setvariable.DataSize = 0;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
@@ -497,6 +507,7 @@ static int getnextvariable_test2(fwts_framework *fw)
while (true) {
long ioret;
+ status = ~0ULL;
variablenamesize = maxvariablenamesize;
ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
@@ -657,6 +668,7 @@ static int getnextvariable_test3(fwts_framework *fw)
while (true) {
struct efi_var_item *item;
+ status = ~0ULL;
variablenamesize = maxvariablenamesize;
ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
@@ -758,7 +770,7 @@ err:
static int getnextvariable_test4(fwts_framework *fw)
{
long ioret;
- uint64_t status;
+ uint64_t status = ~0ULL;
uint64_t i;
struct efi_getnextvariablename getnextvariablename;
@@ -787,6 +799,7 @@ static int getnextvariable_test4(fwts_framework *fw)
getnextvariablename.VariableName = variablename;
getnextvariablename.VendorGuid = NULL;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
@@ -800,6 +813,7 @@ static int getnextvariable_test4(fwts_framework *fw)
getnextvariablename.VendorGuid = &vendorguid;
getnextvariablename.VariableNameSize = NULL;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
@@ -821,6 +835,7 @@ static int getnextvariable_test4(fwts_framework *fw)
* string in VariableName
*/
variablename[0] = '\0';
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
@@ -867,7 +882,7 @@ static int setvariable_insertvariable(
long ioret;
struct efi_setvariable setvariable;
- uint64_t status;
+ uint64_t status = ~0ULL;
uint64_t dataindex;
uint8_t data[datasize + 1];
@@ -936,7 +951,7 @@ static int setvariable_checkvariable(
long ioret;
struct efi_getvariable getvariable;
- uint64_t status;
+ uint64_t status = ~0ULL;
uint8_t testdata[datasize];
uint64_t dataindex;
uint64_t getdatasize = sizeof(testdata);
@@ -992,7 +1007,7 @@ static int setvariable_checkvariable_notfound(
long ioret;
struct efi_getvariable getvariable;
- uint64_t status;
+ uint64_t status = ~0ULL;
uint8_t testdata[MAX_DATA_LENGTH];
uint64_t getdatasize = sizeof(testdata);
uint32_t attributestest;
@@ -1028,7 +1043,7 @@ static int setvariable_invalidattr(
{
long ioret;
struct efi_setvariable setvariable;
- uint64_t status;
+ uint64_t status = ~0ULL;
uint64_t dataindex;
uint8_t data[datasize];
@@ -1374,7 +1389,7 @@ static int setvariable_test8(fwts_framework *fw)
uint32_t attr = attributes | FWTS_UEFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS;
uint64_t datasize = 1;
uint8_t data = 1;
- uint64_t status;
+ uint64_t status = ~0ULL;
setvariable.VariableName = variablenametest;
setvariable.VendorGuid = >estguid1;
@@ -1411,6 +1426,7 @@ static int do_queryvariableinfo(
queryvariableinfo.RemainingVariableStorageSize = remvarstoragesize;
queryvariableinfo.MaximumVariableSize = maxvariablesize;
queryvariableinfo.status = status;
+ *status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_QUERY_VARIABLEINFO, &queryvariableinfo);
@@ -1425,7 +1441,7 @@ static int getnextvariable_multitest(
const uint32_t multitesttime)
{
long ioret;
- uint64_t status;
+ uint64_t status = ~0ULL;
uint32_t i;
struct efi_setvariable setvariable;
@@ -1475,6 +1491,7 @@ static int getnextvariable_multitest(
for (i = 0; i < multitesttime; i++) {
variablename[0] = '\0';
variablenamesize = MAX_DATA_LENGTH;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
if (ioret == -1) {
@@ -1487,6 +1504,7 @@ static int getnextvariable_multitest(
};
setvariable.DataSize = 0;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
@@ -1501,6 +1519,7 @@ static int getnextvariable_multitest(
err_restore_env:
setvariable.DataSize = 0;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
@@ -1816,6 +1835,7 @@ static void getvariable_test_invalid(
long ioret;
fwts_log_info(fw, "Testing GetVariable with %s.", test);
+ *(getvariable->status) = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, getvariable);
if (ioret == -1) {
@@ -1845,7 +1865,8 @@ static int uefirtvariable_test8(fwts_framework *fw)
struct efi_getvariable getvariable;
struct efi_setvariable setvariable;
uint8_t data[16];
- uint64_t status, dataindex;
+ uint64_t status= ~0ULL;
+ uint64_t dataindex;
uint64_t getdatasize = sizeof(data);
uint32_t attr;
int ioret;
@@ -1920,6 +1941,7 @@ static int uefirtvariable_test8(fwts_framework *fw)
/* delete the variable */
setvariable.DataSize = 0;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable);
if (ioret == -1) {
fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetVariable",
diff --git a/src/uefi/uefivarinfo/uefivarinfo.c b/src/uefi/uefivarinfo/uefivarinfo.c
index f8f1f1b..a54a636 100644
--- a/src/uefi/uefivarinfo/uefivarinfo.c
+++ b/src/uefi/uefivarinfo/uefivarinfo.c
@@ -99,6 +99,7 @@ static int do_checkvariables(
variablename[0] = '\0';
while (true) {
long ioret;
+ status = ~0ULL;
variablenamesize = MAX_VARNAME_LENGTH;
ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename);
@@ -127,6 +128,7 @@ static int do_checkvariables(
getvariable.VendorGuid = &vendorguid;
getvariable.DataSize = &getdatasize;
getvariable.Data = data;
+ status = ~0ULL;
ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
if (ioret == -1) {
@@ -151,6 +153,8 @@ static int do_checkvariables(
}
getvariable.Data = data;
+ status = ~0ULL;
+
ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
if (ioret == -1) {
fwts_log_info(fw, "Failed to get variable with variable larger than maximum variable length.");
@@ -185,6 +189,7 @@ static int do_queryvariableinfo(
queryvariableinfo.MaximumVariableStorageSize = maxvarstoragesize;
queryvariableinfo.RemainingVariableStorageSize = remvarstoragesize;
queryvariableinfo.MaximumVariableSize = maxvariablesize;
+ *status = ~0ULL;
queryvariableinfo.status = status;
ioret = ioctl(fd, EFI_RUNTIME_QUERY_VARIABLEINFO, &queryvariableinfo);
--
2.7.4
More information about the fwts-devel
mailing list