efi_loader: UninstallMultipleProtocolInterfaces error code
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Mon, 24 Sep 2018 17:57:27 +0000 (19:57 +0200)
committerAlexander Graf <agraf@suse.de>
Sun, 2 Dec 2018 20:59:36 +0000 (21:59 +0100)
If UninstallMultipleProtocolInterfaces fails, we sometimes return the wrong
status code. The UEFI spec mandates to always return EFI_INVALID_PARAMETER.

Update unit test.

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

index e3d911f..eb652e8 100644 (file)
@@ -2414,7 +2414,8 @@ static efi_status_t EFIAPI efi_uninstall_multiple_protocol_interfaces(
        }
        efi_va_end(argptr);
 
-       return EFI_EXIT(r);
+       /* In case of an error always return EFI_INVALID_PARAMETER */
+       return EFI_EXIT(EFI_INVALID_PARAMETER);
 }
 
 /**
index b09e4cd..0ff35ce 100644 (file)
@@ -189,7 +189,14 @@ static int execute(void)
        /*
         * 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,
@@ -197,13 +204,18 @@ static int execute(void)
                                                &guid2, &interface2,
                                                &guid3, &interface3,
                                                NULL);
-       if (ret == EFI_SUCCESS) {
+       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,
@@ -213,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);