svn commit: r256561 - head/sbin/gvinum

Xin LI delphij at FreeBSD.org
Tue Oct 15 21:04:46 UTC 2013


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);


More information about the svn-src-head mailing list