svn commit: r323867 - head/sys/boot/efi/libefi

Toomas Soome tsoome at FreeBSD.org
Thu Sep 21 15:30:22 UTC 2017


Author: tsoome
Date: Thu Sep 21 15:30:20 2017
New Revision: 323867
URL: https://svnweb.freebsd.org/changeset/base/323867

Log:
  libefi: devicename.c cleanups
  
  Remove duplicated free()+return statements, default unit to 0
  and improve strtol error processing.

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

Modified: head/sys/boot/efi/libefi/devicename.c
==============================================================================
--- head/sys/boot/efi/libefi/devicename.c	Thu Sep 21 14:41:41 2017	(r323866)
+++ head/sys/boot/efi/libefi/devicename.c	Thu Sep 21 15:30:20 2017	(r323867)
@@ -87,9 +87,9 @@ efi_parsedev(struct devdesc **dev, const char *devspec
 {
 	struct devdesc *idev;
 	struct devsw *dv;
+	int i, unit, err;
 	char *cp;
 	const char *np;
-	int i, err;
 
 	/* minimum length check */
 	if (strlen(devspec) < 2)
@@ -105,6 +105,7 @@ efi_parsedev(struct devdesc **dev, const char *devspec
 		return (ENOENT);
 
 	np = devspec + strlen(dv->dv_name);
+	idev = NULL;
 	err = 0;
 
 	switch (dv->dv_type) {
@@ -117,10 +118,8 @@ efi_parsedev(struct devdesc **dev, const char *devspec
 			return (ENOMEM);
 
 		err = disk_parsedev((struct disk_devdesc *)idev, np, path);
-		if (err != 0) {
-			free(idev);
-			return (err);
-		}
+		if (err != 0)
+			goto fail;
 		break;
 
 #ifdef EFI_ZFS_BOOT
@@ -130,10 +129,8 @@ efi_parsedev(struct devdesc **dev, const char *devspec
 			return (ENOMEM);
 
 		err = zfs_parsedev((struct zfs_devdesc*)idev, np, path);
-		if (err != 0) {
-			free(idev);
-			return (err);
-		}
+		if (err != 0)
+			goto fail;
 		break;
 #endif
 	default:
@@ -141,20 +138,23 @@ efi_parsedev(struct devdesc **dev, const char *devspec
 		if (idev == NULL)
 			return (ENOMEM);
 
-		idev->d_unit = -1;
+		unit = 0;
 		cp = (char *)np;
+
 		if (*np != '\0' && *np != ':') {
-			idev->d_unit = strtol(np, &cp, 0);
-			if (cp == np) {
-				free(idev);
-				return (EUNIT);
+			errno = 0;
+			unit = strtol(np, &cp, 0);
+			if (errno != 0 || cp == np) {
+				err = EUNIT;
+				goto fail;
 			}
 		}
 		if (*cp != '\0' && *cp != ':') {
-			free(idev);
-			return (EINVAL);
+			err = EINVAL;
+			goto fail;
 		}
 
+		idev->d_unit = unit;
 		if (path != NULL)
 			*path = (*cp == 0) ? cp : cp + 1;
 		break;
@@ -168,6 +168,10 @@ efi_parsedev(struct devdesc **dev, const char *devspec
 	else
 		free(idev);
 	return (0);
+
+fail:
+	free(idev);
+	return (err);
 }
 
 char *


More information about the svn-src-all mailing list