svn commit: r285951 - stable/10/sys/boot/efi/libefi
Ed Maste
emaste at FreeBSD.org
Tue Jul 28 12:45:09 UTC 2015
Author: emaste
Date: Tue Jul 28 12:45:08 2015
New Revision: 285951
URL: https://svnweb.freebsd.org/changeset/base/285951
Log:
MFC r285246: Avoid creating invalid UEFI device path
The UEFI loader on the 10.1 release install disk (disc1) modifies an
existing EFI_DEVICE_PATH_PROTOCOL instance in an apparent attempt to
truncate the device path. In doing so it creates an invalid device
path.
Perform the equivalent action without modification of structures
allocated by firmware.
PR: 197641
Submitted by: Chris Ruffin <chris.ruffin at intel.com>
Modified:
stable/10/sys/boot/efi/libefi/efipart.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/boot/efi/libefi/efipart.c
==============================================================================
--- stable/10/sys/boot/efi/libefi/efipart.c Tue Jul 28 12:40:41 2015 (r285950)
+++ stable/10/sys/boot/efi/libefi/efipart.c Tue Jul 28 12:45:08 2015 (r285951)
@@ -63,13 +63,14 @@ static int
efipart_init(void)
{
EFI_BLOCK_IO *blkio;
- EFI_DEVICE_PATH *devpath, *node;
+ EFI_DEVICE_PATH *devpath, *devpathcpy, *tmpdevpath, *node;
EFI_HANDLE *hin, *hout, *aliases, handle;
EFI_STATUS status;
UINTN sz;
CHAR16 *path;
u_int n, nin, nout;
int err;
+ size_t devpathlen;
sz = 0;
hin = NULL;
@@ -98,9 +99,15 @@ efipart_init(void)
if (EFI_ERROR(status)) {
continue;
}
+
node = devpath;
- while (!IsDevicePathEnd(NextDevicePathNode(node)))
+ devpathlen = DevicePathNodeLength(node);
+ while (!IsDevicePathEnd(NextDevicePathNode(node))) {
node = NextDevicePathNode(node);
+ devpathlen += DevicePathNodeLength(node);
+ }
+ devpathlen += DevicePathNodeLength(NextDevicePathNode(node));
+
status = BS->HandleProtocol(hin[n], &blkio_guid,
(void**)&blkio);
if (EFI_ERROR(status))
@@ -117,10 +124,16 @@ efipart_init(void)
*/
if (DevicePathType(node) == MEDIA_DEVICE_PATH &&
DevicePathSubType(node) == MEDIA_CDROM_DP) {
- node->Type = END_DEVICE_PATH_TYPE;
- node->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
- status = BS->LocateDevicePath(&blkio_guid, &devpath,
+ devpathcpy = malloc(devpathlen);
+ memcpy(devpathcpy, devpath, devpathlen);
+ node = devpathcpy;
+ while (!IsDevicePathEnd(NextDevicePathNode(node)))
+ node = NextDevicePathNode(node);
+ SetDevicePathEndNode(node);
+ tmpdevpath = devpathcpy;
+ status = BS->LocateDevicePath(&blkio_guid, &tmpdevpath,
&handle);
+ free(devpathcpy);
if (EFI_ERROR(status))
continue;
hout[nout] = handle;
More information about the svn-src-stable-10
mailing list