svn commit: r323131 - head/sys/boot/efi/boot1

Warner Losh imp at FreeBSD.org
Sat Sep 2 18:18:50 UTC 2017


Author: imp
Date: Sat Sep  2 18:18:49 2017
New Revision: 323131
URL: https://svnweb.freebsd.org/changeset/base/323131

Log:
  Revert r322941: Eliminate redundant device matching functions
  
  Turns out, they are subtly different. I'll refactor anew in the future
  if it's worth it then.
  
  Sponsored by: Netflix
  Reported by: Tomoaki AOKI-san

Modified:
  head/sys/boot/efi/boot1/boot1.c

Modified: head/sys/boot/efi/boot1/boot1.c
==============================================================================
--- head/sys/boot/efi/boot1/boot1.c	Sat Sep  2 17:16:28 2017	(r323130)
+++ head/sys/boot/efi/boot1/boot1.c	Sat Sep  2 18:18:49 2017	(r323131)
@@ -109,6 +109,53 @@ efi_setenv_freebsd_wcs(const char *varname, CHAR16 *va
 }
 
 /*
+ * nodes_match returns TRUE if the imgpath isn't NULL and the nodes match,
+ * FALSE otherwise.
+ */
+static BOOLEAN
+nodes_match(EFI_DEVICE_PATH *imgpath, EFI_DEVICE_PATH *devpath)
+{
+	size_t len;
+
+	if (imgpath == NULL || imgpath->Type != devpath->Type ||
+	    imgpath->SubType != devpath->SubType)
+		return (FALSE);
+
+	len = DevicePathNodeLength(imgpath);
+	if (len != DevicePathNodeLength(devpath))
+		return (FALSE);
+
+	return (memcmp(imgpath, devpath, (size_t)len) == 0);
+}
+
+/*
+ * device_paths_match returns TRUE if the imgpath isn't NULL and all nodes
+ * in imgpath and devpath match up to their respective occurrences of a
+ * media node, FALSE otherwise.
+ */
+static BOOLEAN
+device_paths_match(EFI_DEVICE_PATH *imgpath, EFI_DEVICE_PATH *devpath)
+{
+
+	if (imgpath == NULL)
+		return (FALSE);
+
+	while (!IsDevicePathEnd(imgpath) && !IsDevicePathEnd(devpath)) {
+		if (IsDevicePathType(imgpath, MEDIA_DEVICE_PATH) &&
+		    IsDevicePathType(devpath, MEDIA_DEVICE_PATH))
+			return (TRUE);
+
+		if (!nodes_match(imgpath, devpath))
+			return (FALSE);
+
+		imgpath = NextDevicePathNode(imgpath);
+		devpath = NextDevicePathNode(devpath);
+	}
+
+	return (FALSE);
+}
+
+/*
  * devpath_last returns the last non-path end node in devpath.
  */
 static EFI_DEVICE_PATH *
@@ -304,7 +351,7 @@ probe_handle(EFI_HANDLE h, EFI_DEVICE_PATH *imgpath, B
 	if (!blkio->Media->LogicalPartition)
 		return (EFI_UNSUPPORTED);
 
-	*preferred = efi_devpath_match(imgpath, devpath);
+	*preferred = device_paths_match(imgpath, devpath);
 
 	/* Run through each module, see if it can load this partition */
 	for (i = 0; i < NUM_BOOT_MODULES; i++) {


More information about the svn-src-head mailing list