[libvirt] [PATCH] storage: use valid XML for awkward volume names
Eric Blake
eblake at redhat.com
Fri Nov 22 00:28:59 UTC 2013
On 11/21/2013 04:57 PM, Eric Blake wrote:
> volume defs during pool refresh and not from xml reparsing; but you do
> have a point that on CreateVol, we need to be careful to ignore any
> input key and use the one that the storage volume would have generated
> normally; likewise, we must ensure we don't leak memory.
>
> I'm still checking...
>
I verified that the only user XML paths are virStorageVolCreateXML and
virStorageVolCreateXMLFrom; and that both paths filter through the
storage backend->createVol() before ever attempting to use the key in
other locations. So all that remains is auditing each backend's createVol:
backend_fs.c always reset key before setting it during createVol;
nothing to change.
backend_disk.c, on the other hand, enters some code that behaves
differently if key is NULL (if so, image is newly created, populate the
key) compared to non-NULL (look for matching key - even if user's key
was wrong!)
so I didn't even bother checking backend_logical, backend_rbd, or
backend_sheepdog. Instead:
>>
>> ACK if you drop this hunk or fix virStorageBackendDiskCreateVol.
>
> I'll reply again with what I squash in after auditing all paths where
> the user passes in volume XML to make sure we aren't leaking or using
> the wrong key.
I squashed in this, which avoids the problem for all storage backends.
diff --git i/src/storage/storage_driver.c w/src/storage/storage_driver.c
index b3f0871..3b4715a 100644
--- i/src/storage/storage_driver.c
+++ w/src/storage/storage_driver.c
@@ -1554,6 +1554,9 @@ storageVolCreateXML(virStoragePoolPtr obj,
goto cleanup;
}
+ /* Wipe any key the user may have suggested, as volume creation
+ * will generate the canonical key. */
+ VIR_FREE(voldef->key);
if (backend->createVol(obj->conn, pool, voldef) < 0) {
goto cleanup;
}
@@ -1729,7 +1732,10 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj,
pool->volumes.count+1) < 0)
goto cleanup;
- /* 'Define' the new volume so we get async progress reporting */
+ /* 'Define' the new volume so we get async progress reporting.
+ * Wipe any key the user may have suggested, as volume creation
+ * will generate the canonical key. */
+ VIR_FREE(newvol->key);
if (backend->createVol(obj->conn, pool, newvol) < 0) {
goto cleanup;
}
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20131121/38f9b846/attachment-0001.sig>
More information about the libvir-list
mailing list