Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Jul 2015 12:45:08 +0000 (UTC)
From:      Ed Maste <emaste@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r285951 - stable/10/sys/boot/efi/libefi
Message-ID:  <201507281245.t6SCj8Vt001803@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



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