*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;
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;
/* 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)
/* '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) */