From 12a6278135f48796bc9f0df7c4558847fa88c1e6 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Thu, 9 Jul 2009 21:51:36 -0400 Subject: [PATCH] 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. --- src/storage_backend_disk.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) 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; -- GitLab