efi_loader: validate load option
[oweals/u-boot.git] / lib / efi_selftest / efi_selftest_manageprotocols.c
index f20f1528d471e9989e556d26e010cfaea0eee6f3..8edb1e4d4671f6aaa0bcec1b65ca992929cc3b2f 100644 (file)
@@ -1,10 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * efi_selftest_manageprotocols
  *
  * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
  *
- * SPDX-License-Identifier:     GPL-2.0+
- *
  * This unit test checks the following protocol services:
  * InstallProtocolInterface, UninstallProtocolInterface,
  * InstallMultipleProtocolsInterfaces, UninstallMultipleProtocolsInterfaces,
@@ -180,12 +179,24 @@ static int execute(void)
                efi_st_error("LocateHandleBuffer failed to locate new handle\n");
                return EFI_ST_FAILURE;
        }
-       boottime->set_mem(buffer, sizeof(efi_handle_t) * buffer_size, 0);
+       /* Release buffer */
+       ret = boottime->free_pool(buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("FreePool failed\n");
+               return EFI_ST_FAILURE;
+       }
 
        /*
         * Test error handling in UninstallMultipleProtocols
         *
-        * Try to uninstall more protocols than there are installed.
+        * These are the installed protocol interfaces on handle 2:
+        *
+        *   guid1 interface4
+        *   guid2 interface2
+        *
+        * Try to uninstall more protocols than there are installed. This
+        * should return an error EFI_INVALID_PARAMETER. All deleted protocols
+        * should be reinstalled.
         */
        ret = boottime->uninstall_multiple_protocol_interfaces(
                                                handle2,
@@ -193,13 +204,18 @@ static int execute(void)
                                                &guid2, &interface2,
                                                &guid3, &interface3,
                                                NULL);
-       if (ret == EFI_SUCCESS) {
-               efi_st_todo("UninstallMultipleProtocolInterfaces did not catch error\n");
+       if (ret != EFI_INVALID_PARAMETER) {
+               printf("%lx", ret);
+               efi_st_error("UninstallMultipleProtocolInterfaces did not catch error\n");
                return EFI_ST_FAILURE;
        }
 
        /*
         * Test LocateHandleBuffer with ByProtocol
+        *
+        * These are the handles with a guid1 protocol interface installed:
+        *
+        *      handle1, handle2
         */
        count = buffer_size;
        ret = boottime->locate_handle_buffer(BY_PROTOCOL, &guid1, NULL,
@@ -209,7 +225,7 @@ static int execute(void)
                return EFI_ST_FAILURE;
        }
        if (count != 2) {
-               efi_st_error("LocateHandleBuffer failed to locate new handles\n");
+               efi_st_error("UninstallMultipleProtocolInterfaces deleted handle\n");
                return EFI_ST_FAILURE;
        }
        ret = find_in_buffer(handle1, count, buffer);
@@ -222,6 +238,7 @@ static int execute(void)
                efi_st_error("LocateHandleBuffer failed to locate new handle\n");
                return EFI_ST_FAILURE;
        }
+       /* Clear the buffer, we are reusing it it the next step. */
        boottime->set_mem(buffer, sizeof(efi_handle_t) * buffer_size, 0);
 
        /*
@@ -249,7 +266,12 @@ static int execute(void)
                efi_st_error("LocateHandle failed to locate new handles\n");
                return EFI_ST_FAILURE;
        }
-       boottime->set_mem(buffer, sizeof(efi_handle_t) * buffer_size, 0);
+       /* Release buffer */
+       ret = boottime->free_pool(buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("FreePool failed\n");
+               return EFI_ST_FAILURE;
+       }
 
        /*
         * Test LocateProtocol
@@ -273,8 +295,8 @@ static int execute(void)
                                                &guid2, &interface2,
                                                NULL);
        if (ret != EFI_SUCCESS) {
-               efi_st_todo("UninstallMultipleProtocolInterfaces failed\n");
-               /* This test is known to fail due to missing implementation */
+               efi_st_error("UninstallMultipleProtocolInterfaces failed\n");
+               return EFI_ST_FAILURE;
        }
        /*
         * Check that the protocols are really uninstalled.
@@ -287,8 +309,8 @@ static int execute(void)
                return EFI_ST_FAILURE;
        }
        if (count != 1) {
-               efi_st_todo("UninstallMultipleProtocolInterfaces failed to uninstall protocols\n");
-               /* This test is known to fail due to missing implementation */
+               efi_st_error("UninstallMultipleProtocolInterfaces failed to uninstall protocols\n");
+               return EFI_ST_FAILURE;
        }
        ret = find_in_buffer(handle1, count, buffer);
        if (ret != EFI_SUCCESS) {
@@ -310,16 +332,22 @@ static int execute(void)
                efi_st_error("Failed to get protocols per handle\n");
                return EFI_ST_FAILURE;
        }
-       if (efi_st_memcmp(prot_buffer[0], &guid1, 16) &&
-           efi_st_memcmp(prot_buffer[1], &guid1, 16)) {
+       if (memcmp(prot_buffer[0], &guid1, 16) &&
+           memcmp(prot_buffer[1], &guid1, 16)) {
                efi_st_error("Failed to get protocols per handle\n");
                return EFI_ST_FAILURE;
        }
-       if (efi_st_memcmp(prot_buffer[0], &guid3, 16) &&
-           efi_st_memcmp(prot_buffer[1], &guid3, 16)) {
+       if (memcmp(prot_buffer[0], &guid3, 16) &&
+           memcmp(prot_buffer[1], &guid3, 16)) {
                efi_st_error("Failed to get protocols per handle\n");
                return EFI_ST_FAILURE;
        }
+       /* Release buffer */
+       ret = boottime->free_pool(prot_buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("FreePool failed\n");
+               return EFI_ST_FAILURE;
+       }
 
        /*
         * Uninstall remaining protocols
@@ -327,19 +355,19 @@ static int execute(void)
        ret = boottime->uninstall_protocol_interface(handle1, &guid1,
                                                     &interface1);
        if (ret != EFI_SUCCESS) {
-               efi_st_todo("UninstallProtocolInterface failed\n");
-               /* This test is known to fail due to missing implementation */
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
        }
        ret = boottime->handle_protocol(handle1, &guid1, (void **)&interface);
        if (ret == EFI_SUCCESS) {
-               efi_st_todo("UninstallProtocolInterface failed\n");
-               /* This test is known to fail due to missing implementation */
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
        }
        ret = boottime->uninstall_protocol_interface(handle1, &guid3,
-                                                    &interface1);
+                                                    &interface3);
        if (ret != EFI_SUCCESS) {
-               efi_st_todo("UninstallProtocolInterface failed\n");
-               /* This test is known to fail due to missing implementation */
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
        }
 
        return EFI_ST_SUCCESS;