[libvirt] [PATCH 2/4] storage: disk: Fix segfault creating volume without target path

Cole Robinson crobinso at redhat.com
Fri Jul 10 19:32:21 UTC 2009


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 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/src/storage_backend_disk.c b/src/storage_backend_disk.c
index 1eb3eac..e50825b 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;
 
-- 
1.6.0.6




More information about the libvir-list mailing list