[U-Boot,v2,1/8] efi_selftest: do not execute test if setup failed

Message ID 20180416055910.12611-2-xypron.glpk@gmx.de
State Accepted
Delegated to: Alexander Graf
Headers show
Series
  • efi_loader: fixes for EFI_DEVICE_PATH_UTILITIES_PROTOCOL
Related show

Commit Message

Heinrich Schuchardt April 16, 2018, 5:59 a.m.
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>
---
v2
	no change
---
 include/efi_selftest.h          |  2 ++
 lib/efi_selftest/efi_selftest.c | 14 +++++++-------
 2 files changed, 9 insertions(+), 7 deletions(-)

Patch

diff --git a/include/efi_selftest.h b/include/efi_selftest.h
index 08dd8e43ad..c23bc24bed 100644
--- a/include/efi_selftest.h
+++ b/include/efi_selftest.h
@@ -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;
 };
 
diff --git a/lib/efi_selftest/efi_selftest.c b/lib/efi_selftest/efi_selftest.c
index fc5ef254a1..fd4fee726f 100644
--- a/lib/efi_selftest/efi_selftest.c
+++ b/lib/efi_selftest/efi_selftest.c
@@ -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);