summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeinrich Schuchardt <xypron.glpk@gmx.de>2020-05-21 09:22:06 +0200
committerHeinrich Schuchardt <xypron.glpk@gmx.de>2020-05-21 10:00:17 +0200
commit0a87e05dbd1b6ddafd61603e2a9c12659168ae65 (patch)
treef9a55af7b86066d486d6203e9219a2143ebd1d07
parentbf3bcef7fb8ef4b0bb56d00304a934a5a5eb187e (diff)
downloadu-boot-0a87e05dbd1b6ddafd61603e2a9c12659168ae65.tar.gz
u-boot-0a87e05dbd1b6ddafd61603e2a9c12659168ae65.tar.xz
u-boot-0a87e05dbd1b6ddafd61603e2a9c12659168ae65.zip
efi_loader: check device path is not installed twice
Prior to corrective patches for virtio and SATA devices the same device path was installed on two different handles. This is not allowable. With this patch we will throw an error if this condition occurs for block devices. Update a comment for the installation of the simple file system protocol. Reported-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
-rw-r--r--lib/efi_loader/efi_disk.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index 9176008c0e..670bf2b8ef 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -356,6 +356,7 @@ static efi_status_t efi_disk_add_dev(
struct efi_disk_obj **disk)
{
struct efi_disk_obj *diskobj;
+ struct efi_object *handle;
efi_status_t ret;
/* Don't add empty devices */
@@ -379,15 +380,25 @@ static efi_status_t efi_disk_add_dev(
diskobj->dp = efi_dp_from_part(desc, part);
}
diskobj->part = part;
- ret = efi_add_protocol(&diskobj->header, &efi_block_io_guid,
- &diskobj->ops);
- if (ret != EFI_SUCCESS)
- return ret;
- ret = efi_add_protocol(&diskobj->header, &efi_guid_device_path,
- diskobj->dp);
+
+ /*
+ * Install the device path and the block IO protocol.
+ *
+ * InstallMultipleProtocolInterfaces() checks if the device path is
+ * already installed on an other handle and returns EFI_ALREADY_STARTED
+ * in this case.
+ */
+ handle = &diskobj->header;
+ ret = EFI_CALL(efi_install_multiple_protocol_interfaces(
+ &handle, &efi_guid_device_path, diskobj->dp,
+ &efi_block_io_guid, &diskobj->ops, NULL));
if (ret != EFI_SUCCESS)
return ret;
- /* partitions or whole disk without partitions */
+
+ /*
+ * On partitions or whole disks without partitions install the
+ * simple file system protocol if a file system is available.
+ */
if ((part || desc->part_type == PART_TYPE_UNKNOWN) &&
efi_fs_exists(desc, part)) {
diskobj->volume = efi_simple_file_system(desc, part,