[libvirt] [PATCH] fix xenDaemonListDefinedDomains

Jim Fehlig jfehlig at novell.com
Wed Nov 25 01:13:05 UTC 2009


Matthias Bolte wrote:
> 2009/11/25 Jim Fehlig <jfehlig at novell.com>:
>   
>> Commit 790f0b3057787bb64da8c46c111ff8d3eff7b2af causes contents of names
>> array to be freed even on success, resulting in no listing of defined
>> but inactive Xen domains. Patch below fixes it.
>>
>> Regards,
>> Jim
>>
>>     
>
> Good catch, I just reviewed this commit to see if I've caused similar
> bugs elsewhere, but this seems to be the only one.
>   

I had looked elsewhere in that commit as well but didn't see any other
problems.

>   
>> Index: libvirt-0.7.4/src/xen/xend_internal.c
>> ===================================================================
>> --- libvirt-0.7.4.orig/src/xen/xend_internal.c
>> +++ libvirt-0.7.4/src/xen/xend_internal.c
>> @@ -4693,13 +4693,14 @@ xenDaemonListDefinedDomains(virConnectPt
>>          }
>>
>>          if (ret >= maxnames)
>> -            break;
>> +            goto out;
>>      }
>>
>>  error:
>>      for (i = 0; i < ret; ++i)
>>          VIR_FREE(names[i]);
>>
>> +out:
>>      sexpr_free(root);
>>      return(ret);
>>  }
>>     
>
> Your patch doesn't fix the problem in all situations. If maxnames is
> larger than the actual number of domains then goto out is never
> executed.
>   

Ah, yes - good catch.

> I also forgot to set ret to -1 after freeing the names, this needs to
> be fixed too.
>
> I propose the attached patch to solve this issues.
>
> Matthias
>   
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index d61e9e6..a0c7d77 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -4696,12 +4696,17 @@ xenDaemonListDefinedDomains(virConnectPtr conn, char **const names, int maxnames
>              break;
>      }
>  
> +cleanup:
> +    sexpr_free(root);
> +    return(ret);
> +
>  error:
>      for (i = 0; i < ret; ++i)
>          VIR_FREE(names[i]);
>  
> -    sexpr_free(root);
> -    return(ret);
> +    ret = -1;
> +
> +    goto cleanup;
>  }
>  
>  /**
>   

ACK.  Thanks again!

Jim




More information about the libvir-list mailing list