From 10e27f768b7f5b1a26a80ee09b568ecda7d361cf Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Sat, 7 Jan 2023 12:03:28 +0100 Subject: [PATCH] boot: Take advantage of packed device paths Now that device path types are marked as packed we can safely cast and access them. If we ever take the address of a member, we would get a compiler warning. --- src/boot/efi/device-path-util.c | 13 +++++++------ src/boot/efi/part-discovery.c | 9 +++------ src/boot/efi/vmm.c | 4 ++-- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/boot/efi/device-path-util.c b/src/boot/efi/device-path-util.c index c376d7a845d..fe5e3a83ce3 100644 --- a/src/boot/efi/device-path-util.c +++ b/src/boot/efi/device-path-util.c @@ -25,12 +25,13 @@ EFI_STATUS make_file_device_path(EFI_HANDLE device, const char16_t *file, EFI_DE *ret_dp = xmalloc(dp_size + file_size + sizeof(FILEPATH_DEVICE_PATH) + sizeof(EFI_DEVICE_PATH)); dp = mempcpy(*ret_dp, dp, dp_size); - /* Replace end node with file media device path. Use memcpy() in case dp is unaligned (if accessed as - * FILEPATH_DEVICE_PATH). */ - dp->Type = MEDIA_DEVICE_PATH; - dp->SubType = MEDIA_FILEPATH_DP; - dp->Length = sizeof(FILEPATH_DEVICE_PATH) + file_size; - memcpy((uint8_t *) dp + sizeof(FILEPATH_DEVICE_PATH), file, file_size); + FILEPATH_DEVICE_PATH *file_dp = (FILEPATH_DEVICE_PATH *) dp; + file_dp->Header = (EFI_DEVICE_PATH) { + .Type = MEDIA_DEVICE_PATH, + .SubType = MEDIA_FILEPATH_DP, + .Length = sizeof(FILEPATH_DEVICE_PATH) + file_size, + }; + memcpy(file_dp->PathName, file, file_size); dp = device_path_next_node(dp); *dp = DEVICE_PATH_END_NODE; diff --git a/src/boot/efi/part-discovery.c b/src/boot/efi/part-discovery.c index 4769d11bd87..f5b15730559 100644 --- a/src/boot/efi/part-discovery.c +++ b/src/boot/efi/part-discovery.c @@ -287,14 +287,11 @@ char16_t *disk_get_part_uuid(EFI_HANDLE *handle) { if (dp->Type != MEDIA_DEVICE_PATH || dp->SubType != MEDIA_HARDDRIVE_DP) continue; - /* The HD device path may be misaligned. */ - HARDDRIVE_DEVICE_PATH hd; - memcpy(&hd, dp, MIN(sizeof(hd), dp->Length)); - - if (hd.SignatureType != SIGNATURE_TYPE_GUID) + HARDDRIVE_DEVICE_PATH *hd = (HARDDRIVE_DEVICE_PATH *) dp; + if (hd->SignatureType != SIGNATURE_TYPE_GUID) continue; - return xasprintf(GUID_FORMAT_STR, GUID_FORMAT_VAL(hd.SignatureGuid)); + return xasprintf(GUID_FORMAT_STR, GUID_FORMAT_VAL(hd->SignatureGuid)); } return NULL; diff --git a/src/boot/efi/vmm.c b/src/boot/efi/vmm.c index 61b50a3b94f..f5c17a9eca0 100644 --- a/src/boot/efi/vmm.c +++ b/src/boot/efi/vmm.c @@ -20,7 +20,7 @@ /* detect direct boot */ bool is_direct_boot(EFI_HANDLE device) { EFI_STATUS err; - VENDOR_DEVICE_PATH *dp; /* NB: Alignment of this structure might be quirky! */ + VENDOR_DEVICE_PATH *dp; err = BS->HandleProtocol(device, MAKE_GUID_PTR(EFI_DEVICE_PATH_PROTOCOL), (void **) &dp); if (err != EFI_SUCCESS) @@ -29,7 +29,7 @@ bool is_direct_boot(EFI_HANDLE device) { /* 'qemu -kernel systemd-bootx64.efi' */ if (dp->Header.Type == MEDIA_DEVICE_PATH && dp->Header.SubType == MEDIA_VENDOR_DP && - memcmp(&dp->Guid, MAKE_GUID_PTR(QEMU_KERNEL_LOADER_FS_MEDIA), sizeof(EFI_GUID)) == 0) /* Don't change to efi_guid_equal() because EFI device path objects are not necessarily aligned! */ + memcmp(&dp->Guid, MAKE_GUID_PTR(QEMU_KERNEL_LOADER_FS_MEDIA), sizeof(EFI_GUID)) == 0) return true; /* loaded from firmware volume (sd-boot added to ovmf) */ -- 2.47.3