[libvirt] [PATCH] storage: Avoid double virCommandFree in virStorageBackendLogicalDeletePool
Martin Kletzander
mkletzan at redhat.com
Fri Mar 29 10:30:51 UTC 2013
On 03/28/2013 05:13 PM, Michal Privoznik wrote:
> On 28.03.2013 17:06, Martin Kletzander wrote:
>> When logical pool has no PVs associated with itself (user-created),
>> virCommandFree(cmd) is called twice with the same pointer and that
>> causes a segfault in daemon.
>>
>> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
>> ---
>> Worth v1.0.4 IMHO.
>> ---
>> src/storage/storage_backend_logical.c | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
>> index bce407f..4cf6647 100644
>> --- a/src/storage/storage_backend_logical.c
>> +++ b/src/storage/storage_backend_logical.c
>> @@ -1,7 +1,7 @@
>> /*
>> * storage_backend_logical.c: storage backend for logical volume handling
>> *
>> - * Copyright (C) 2007-2009, 2011 Red Hat, Inc.
>> + * Copyright (C) 2007-2009, 2011, 2013 Red Hat, Inc.
>> * Copyright (C) 2007-2008 Daniel P. Berrange
>> *
>> * This library is free software; you can redistribute it and/or
>> @@ -667,6 +667,7 @@ virStorageBackendLogicalDeletePool(virConnectPtr conn ATTRIBUTE_UNUSED,
>> if (virCommandRun(cmd, NULL) < 0)
>> goto cleanup;
>> virCommandFree(cmd);
>> + cmd = NULL;
>>
>> /* now remove the pv devices and clear them out */
>> ret = 0;=
>
> Alternatively, you can just remove a few lines:
>
> diff --git a/src/storage/storage_backend_logical.c
> b/src/storage/storage_backend_logical.c
> index 8cce978..d911cf3 100644
> --- a/src/storage/storage_backend_logical.c
> +++ b/src/storage/storage_backend_logical.c
> @@ -667,11 +667,11 @@ virStorageBackendLogicalDeletePool(virConnectPtr
> conn ATTRIBUTE_UNUSED,
> NULL);
> if (virCommandRun(cmd, NULL) < 0)
> goto cleanup;
> - virCommandFree(cmd);
>
> /* now remove the pv devices and clear them out */
> ret = 0;
> for (i = 0 ; i < pool->def->source.ndevice ; i++) {
> + virCommandFree(cmd);
> cmd = virCommandNewArgList(PVREMOVE,
> pool->def->source.devices[i].path,
> NULL);
> @@ -679,8 +679,6 @@ virStorageBackendLogicalDeletePool(virConnectPtr
> conn ATTRIBUTE_UNUSED,
> ret = -1;
> break;
> }
> - virCommandFree(cmd);
> - cmd = NULL;
> }
>
> cleanup:
>
>
> However, your approach works as well. ACK.
>
Thanks, I pushed my clumsy version as I had it prepared, but feel free
to change that.
Martin
More information about the libvir-list
mailing list