Author: delphij
Date: Tue Oct 15 21:04:46 2013
New Revision: 256561
URL: http://svnweb.freebsd.org/changeset/base/256561

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

Modified:
  head/sbin/gvinum/gvinum.c

Modified: head/sbin/gvinum/gvinum.c
==============================================================================
--- head/sbin/gvinum/gvinum.c   Tue Oct 15 21:04:18 2013        (r256560)
+++ head/sbin/gvinum/gvinum.c   Tue Oct 15 21:04:46 2013        (r256561)
@@ -421,6 +421,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;
@@ -448,10 +449,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. */
@@ -461,14 +460,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);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to