[libvirt] [PATCH] storage: Fix a potential crash when creating vol object

If the vol object is newly created, it increases the volumes count, but doesn't decrease the volumes count when do cleanup. It can cause libvirtd crash when one trying to free the volume objects like: for (i = 0; i < pool->volumes.count; i++) virStorageVolDefFree(pool->volumes.objs[i]); It's more reliale if we add the newly created vol object in the end. --- src/storage/storage_backend_logical.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c index 61c89a2..1420ede 100644 --- a/src/storage/storage_backend_logical.c +++ b/src/storage/storage_backend_logical.c @@ -110,7 +110,6 @@ virStorageBackendLogicalMakeVol(virStoragePoolObjPtr pool, virReportOOMError(); goto cleanup; } - pool->volumes.objs[pool->volumes.count++] = vol; } if (vol->target.path == NULL) { @@ -254,6 +253,9 @@ virStorageBackendLogicalMakeVol(virStoragePoolObjPtr pool, vol->source.nextent++; } + if (is_new_vol) + pool->volumes.objs[pool->volumes.count++] = vol; + ret = 0; cleanup: -- 1.7.1

On 12/12/2011 12:26 AM, Osier Yang wrote:
If the vol object is newly created, it increases the volumes count, but doesn't decrease the volumes count when do cleanup. It can cause libvirtd crash when one trying to free the volume objects
s/crash/to crash/
like: for (i = 0; i < pool->volumes.count; i++) virStorageVolDefFree(pool->volumes.objs[i]);
It's more reliale if we add the newly created vol object in the
s/reliale/reliable/
end. --- src/storage/storage_backend_logical.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
ACK. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 2011年12月13日 01:37, Eric Blake wrote:
On 12/12/2011 12:26 AM, Osier Yang wrote:
If the vol object is newly created, it increases the volumes count, but doesn't decrease the volumes count when do cleanup. It can cause libvirtd crash when one trying to free the volume objects
s/crash/to crash/
like: for (i = 0; i< pool->volumes.count; i++) virStorageVolDefFree(pool->volumes.objs[i]);
It's more reliale if we add the newly created vol object in the
s/reliale/reliable/
end. --- src/storage/storage_backend_logical.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
ACK.
Thanks, pushed with the typos fixed. Osier
participants (2)
-
Eric Blake
-
Osier Yang