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++) {
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to