Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Jul 2015 18:44:28 +0000 (UTC)
From:      Ed Maste <emaste@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285246 - head/sys/boot/efi/libefi
Message-ID:  <201507071844.t67IiSwY045523@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: emaste
Date: Tue Jul  7 18:44:27 2015
New Revision: 285246
URL: https://svnweb.freebsd.org/changeset/base/285246

Log:
  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
  MFC After:	1 week
  Submitted by:	Chris Ruffin <chris.ruffin@intel.com>

Modified:
  head/sys/boot/efi/libefi/efipart.c

Modified: head/sys/boot/efi/libefi/efipart.c
==============================================================================
--- head/sys/boot/efi/libefi/efipart.c	Tue Jul  7 18:32:23 2015	(r285245)
+++ head/sys/boot/efi/libefi/efipart.c	Tue Jul  7 18:44:27 2015	(r285246)
@@ -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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507071844.t67IiSwY045523>