]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
boot: Take advantage of packed device paths 26542/head
authorJan Janssen <medhefgo@web.de>
Sat, 7 Jan 2023 11:03:28 +0000 (12:03 +0100)
committerJan Janssen <medhefgo@web.de>
Wed, 22 Feb 2023 20:56:26 +0000 (21:56 +0100)
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
src/boot/efi/part-discovery.c
src/boot/efi/vmm.c

index c376d7a845d5289d9944d7b4539d1582434c6042..fe5e3a83ce3a2bc2a3f2e11ccde34b27d3403ce3 100644 (file)
@@ -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;
index 4769d11bd872bebfc6237f815c19d384fd42b369..f5b157305594c6d21d773a52ff95dab5feb1fa48 100644 (file)
@@ -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;
index 61b50a3b94fdc86d6a4d3254812c6d1b8d4f0e78..f5c17a9eca0e70144a6b02afe05be2aeaab1c2ad 100644 (file)
@@ -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) */