]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
boot: Drop use of UnpackDevicePath
authorJan Janssen <medhefgo@web.de>
Sun, 29 May 2022 08:33:42 +0000 (10:33 +0200)
committerJan Janssen <medhefgo@web.de>
Thu, 9 Jun 2022 10:50:13 +0000 (12:50 +0200)
Device paths are a packed data structure and the UEFI spec is clear that
members may be misaligned.

In this case all accesses are aligned except for the signature. We can
simply memcpy it instead of making a whole (aligned) copy of the device
path.

src/boot/efi/disk.c

index fcd5812ff16bca3a34fc65bab8ac1bbc8cff5dcb..bf2984ed1fa5919f36c63f26090aa603a61aed50 100644 (file)
@@ -8,31 +8,32 @@
 
 EFI_STATUS disk_get_part_uuid(EFI_HANDLE *handle, CHAR16 uuid[static 37]) {
         EFI_STATUS err;
-        EFI_DEVICE_PATH *device_path;
-        _cleanup_freepool_ EFI_DEVICE_PATH *paths = NULL;
+        EFI_DEVICE_PATH *dp;
 
         /* export the device path this image is started from */
 
         if (!handle)
                 return EFI_NOT_FOUND;
 
-        err = BS->HandleProtocol(handle, &DevicePathProtocol, (void **) &device_path);
+        err = BS->HandleProtocol(handle, &DevicePathProtocol, (void **) &dp);
         if (err != EFI_SUCCESS)
                 return err;
 
-        paths = UnpackDevicePath(device_path);
-        for (EFI_DEVICE_PATH *path = paths; !IsDevicePathEnd(path); path = NextDevicePathNode(path)) {
-                HARDDRIVE_DEVICE_PATH *drive;
-
-                if (DevicePathType(path) != MEDIA_DEVICE_PATH)
+        for (; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp)) {
+                if (DevicePathType(dp) != MEDIA_DEVICE_PATH)
                         continue;
-                if (DevicePathSubType(path) != MEDIA_HARDDRIVE_DP)
+                if (DevicePathSubType(dp) != MEDIA_HARDDRIVE_DP)
                         continue;
-                drive = (HARDDRIVE_DEVICE_PATH *)path;
-                if (drive->SignatureType != SIGNATURE_TYPE_GUID)
+
+                HARDDRIVE_DEVICE_PATH *hd = (HARDDRIVE_DEVICE_PATH *) dp;
+                if (hd->SignatureType != SIGNATURE_TYPE_GUID)
                         continue;
 
-                GuidToString(uuid, (EFI_GUID *)&drive->Signature);
+                /* Use memcpy in case the device path node is misaligned. */
+                EFI_GUID sig;
+                memcpy(&sig, hd->Signature, sizeof(hd->Signature));
+
+                GuidToString(uuid, &sig);
                 return EFI_SUCCESS;
         }