svn commit: r285956 - releng/10.2/sys/boot/efi/libefi
Ed Maste
emaste at FreeBSD.org
Tue Jul 28 13:11:32 UTC 2015
Author: emaste
Date: Tue Jul 28 13:11:31 2015
New Revision: 285956
URL: https://svnweb.freebsd.org/changeset/base/285956
Log:
MFS r285951: 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>
Approved by: re (gjb)
Modified:
releng/10.2/sys/boot/efi/libefi/efipart.c
Directory Properties:
releng/10.2/ (props changed)
Modified: releng/10.2/sys/boot/efi/libefi/efipart.c
==============================================================================
--- releng/10.2/sys/boot/efi/libefi/efipart.c Tue Jul 28 13:09:16 2015 (r285955)
+++ releng/10.2/sys/boot/efi/libefi/efipart.c Tue Jul 28 13:11:31 2015 (r285956)
@@ -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-releng
mailing list