From: Cole Robinson Date: Fri, 10 Jul 2009 01:51:36 +0000 (-0400) Subject: storage: disk: Fix segfault creating volume without target path X-Git-Tag: v0.7.0~168 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=12a6278135f48796bc9f0df7c4558847fa88c1e6;p=thirdparty%2Flibvirt.git storage: disk: Fix segfault creating volume without target path Remove unneeded target path duplication, which could carelessly dereference NULL. Make it clear where 'key' is actually filled in. --- diff --git a/src/storage_backend_disk.c b/src/storage_backend_disk.c index eb694a7d2e..a029d31d0e 100644 --- a/src/storage_backend_disk.c +++ b/src/storage_backend_disk.c @@ -226,10 +226,18 @@ virStorageBackendDiskMakeVol(virConnectPtr conn, if (STREQ(groups[2], "metadata") || STREQ(groups[2], "data")) { virStorageVolDefPtr vol = data; - /* We're searching for a specific vol only, so ignore others */ - if (vol && - STRNEQ(vol->name, groups[0])) - return 0; + + if (vol) { + /* We're searching for a specific vol only */ + if (vol->key) { + if (STRNEQ(vol->key, groups[0])) + return 0; + } else if (virStorageVolDefFindByKey(pool, groups[0]) != NULL) { + /* If no key, the volume must be newly created. If groups[0] + * isn't already a volume, assume it's the path we want */ + return 0; + } + } return virStorageBackendDiskMakeDataVol(conn, pool, groups, vol); } else if (STREQ(groups[2], "free")) { @@ -553,15 +561,9 @@ virStorageBackendDiskCreateVol(virConnectPtr conn, return -1; } - if (vol->key == NULL) { - /* XXX base off a unique key of the underlying disk */ - if ((vol->key = strdup(vol->target.path)) == NULL) { - virReportOOMError(conn); - return -1; - } - } - - if(virStorageBackendDiskPartBoundries(conn, pool, &startOffset, &endOffset, vol->allocation) != 0) { + if (virStorageBackendDiskPartBoundries(conn, pool, &startOffset, + &endOffset, + vol->allocation) != 0) { return -1; } @@ -580,7 +582,10 @@ virStorageBackendDiskCreateVol(virConnectPtr conn, VIR_FREE(pool->def->source.devices[0].freeExtents); pool->def->source.devices[0].nfreeExtent = 0; - /* Fetch actual extent info */ + /* Specifying a target path is meaningless */ + VIR_FREE(vol->target.path); + + /* Fetch actual extent info, generate key */ if (virStorageBackendDiskReadPartitions(conn, pool, vol) < 0) return -1;