Author: marius
Date: Wed May 14 16:16:23 2014
New Revision: 266042
URL: http://svnweb.freebsd.org/changeset/base/266042

Log:
  MFC: r256561
  
  Prevent an unlikely, but real double free issue in gvinum(8).
  
  Coverity ID: 1018965

Modified:
  stable/10/sbin/gvinum/gvinum.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sbin/gvinum/gvinum.c
==============================================================================
--- stable/10/sbin/gvinum/gvinum.c      Wed May 14 15:52:36 2014        
(r266041)
+++ stable/10/sbin/gvinum/gvinum.c      Wed May 14 16:16:23 2014        
(r266042)
@@ -423,6 +423,7 @@ create_drive(char *device)
        const char *errstr;
        char *drivename, *dname;
        int drives, i, flags, volumes, subdisks, plexes;
+       int found = 0;
 
        flags = plexes = subdisks = volumes = 0;
        drives = 1;
@@ -450,10 +451,8 @@ create_drive(char *device)
        errstr = gctl_issue(req);
        if (errstr != NULL) {
                warnx("error creating drive: %s", errstr);
-               gctl_free(req);
-               return (NULL);
+               drivename = NULL;
        } else {
-               gctl_free(req);
                /* XXX: This is needed because we have to make sure the drives
                 * are created before we return. */
                /* Loop until it's in the config. */
@@ -463,14 +462,18 @@ create_drive(char *device)
                        /* If we got a different name, quit. */
                        if (dname == NULL)
                                continue;
-                       if (strcmp(dname, drivename)) {
-                               free(dname);
-                               return (drivename);
-                       }
+                       if (strcmp(dname, drivename))
+                               found = 1;
                        free(dname);
                        dname = NULL;
+                       if (found)
+                               break;
                        usleep(100000); /* Sleep for 0.1s */
                }
+               if (found == 0) {
+                       warnx("error creating drive");
+                       drivename = NULL;
+               }
        }
        gctl_free(req);
        return (drivename);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to