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.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
+2
-2
@@ -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) */
|
||||
|
||||
Reference in New Issue
Block a user