summaryrefslogtreecommitdiffstats
path: root/sbin/gvinum
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2013-10-15 21:04:46 +0000
committerdelphij <delphij@FreeBSD.org>2013-10-15 21:04:46 +0000
commitb9099489a8b0d52470266a4a360763d8f4de2c75 (patch)
tree4cc87daabfa4c4c8b252f9e4009a564b35d2540a /sbin/gvinum
parent5532d94759e5176fd123f83682d50ec5c56b5500 (diff)
downloadFreeBSD-src-b9099489a8b0d52470266a4a360763d8f4de2c75.zip
FreeBSD-src-b9099489a8b0d52470266a4a360763d8f4de2c75.tar.gz
Prevent an unlikely, but real double free issue in gvinum(8).
Coverity ID: 1018965
Diffstat (limited to 'sbin/gvinum')
-rw-r--r--sbin/gvinum/gvinum.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/sbin/gvinum/gvinum.c b/sbin/gvinum/gvinum.c
index bb4b47d..5760d2b 100644
--- a/sbin/gvinum/gvinum.c
+++ b/sbin/gvinum/gvinum.c
@@ -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);
OpenPOWER on IntegriCloud