efi_selftest: do not execute test if setup failed
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Mon, 16 Apr 2018 05:59:03 +0000 (07:59 +0200)
committerAlexander Graf <agraf@suse.de>
Mon, 23 Apr 2018 19:34:28 +0000 (21:34 +0200)
Executing a test after failed setup may lead to unexpected behavior like
an illegal memory access. So after a setup failure we should skip to
teardown.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
include/efi_selftest.h
lib/efi_selftest/efi_selftest.c

index 08dd8e43ad1c1ec4f829257f68914cef2c294df5..c23bc24bed0f5d0935c84bc26c199598606e52d8 100644 (file)
@@ -114,6 +114,7 @@ u16 efi_st_get_key(void);
  * @setup:     set up the unit test
  * @teardown:  tear down the unit test
  * @execute:   execute the unit test
+ * @setup_ok:  setup was successful (set at runtime)
  * @on_request:        test is only executed on request
  */
 struct efi_unit_test {
@@ -123,6 +124,7 @@ struct efi_unit_test {
                     const struct efi_system_table *systable);
        int (*execute)(void);
        int (*teardown)(void);
+       int setup_ok;
        bool on_request;
 };
 
index fc5ef254a1d14c1e256c2ff304f07c22cdd50614..fd4fee726fc8d52337d9890b332fb988f9041688 100644 (file)
@@ -77,20 +77,20 @@ void efi_st_exit_boot_services(void)
  */
 static int setup(struct efi_unit_test *test, unsigned int *failures)
 {
-       int ret;
-
-       if (!test->setup)
+       if (!test->setup) {
+               test->setup_ok = EFI_ST_SUCCESS;
                return EFI_ST_SUCCESS;
+       }
        efi_st_printc(EFI_LIGHTBLUE, "\nSetting up '%s'\n", test->name);
-       ret = test->setup(handle, systable);
-       if (ret != EFI_ST_SUCCESS) {
+       test->setup_ok = test->setup(handle, systable);
+       if (test->setup_ok != EFI_ST_SUCCESS) {
                efi_st_error("Setting up '%s' failed\n", test->name);
                ++*failures;
        } else {
                efi_st_printc(EFI_LIGHTGREEN,
                              "Setting up '%s' succeeded\n", test->name);
        }
-       return ret;
+       return test->setup_ok;
 }
 
 /*
@@ -200,7 +200,7 @@ void efi_st_do_tests(const u16 *testname, unsigned int phase,
                        continue;
                if (steps & EFI_ST_SETUP)
                        setup(test, failures);
-               if (steps & EFI_ST_EXECUTE)
+               if (steps & EFI_ST_EXECUTE && test->setup_ok == EFI_ST_SUCCESS)
                        execute(test, failures);
                if (steps & EFI_ST_TEARDOWN)
                        teardown(test, failures);