svn commit: r266040 - stable/9/sbin/gvinum

Marius Strobl marius at FreeBSD.org
Wed May 14 15:52:27 UTC 2014


Author: marius
Date: Wed May 14 15:52:26 2014
New Revision: 266040
URL: http://svnweb.freebsd.org/changeset/base/266040

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

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

Modified: stable/9/sbin/gvinum/gvinum.c
==============================================================================
--- stable/9/sbin/gvinum/gvinum.c	Wed May 14 15:46:07 2014	(r266039)
+++ stable/9/sbin/gvinum/gvinum.c	Wed May 14 15:52:26 2014	(r266040)
@@ -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-all mailing list