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

Reply via email to