[libvirt] [PATCH 1/2] Remove watches before calling REMOTE_PROC_CLOSE

Chris Lalancette clalance at redhat.com
Wed May 12 13:23:10 UTC 2010


On 05/12/2010 06:10 AM, jdenemar at redhat.com wrote:
> From: Jiri Denemark <jdenemar at redhat.com>
> 
> First calling REMOTE_PROC_CLOSE and then removing watches might lead to
> a hang as HANGUP event can be triggered before the watches are actually
> removed but after virConnectPtr is already freed. As a result of that
> remoteDomainEventFired() would try to lock uninitialized mutex, which
> would hang for ever.
> ---
>  src/remote/remote_driver.c |   10 +++++-----
>  1 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index e4a68ad..990bfce 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -1418,11 +1418,6 @@ verify_certificate (virConnectPtr conn ATTRIBUTE_UNUSED,
>  static int
>  doRemoteClose (virConnectPtr conn, struct private_data *priv)
>  {
> -    if (call (conn, priv, 0, REMOTE_PROC_CLOSE,
> -              (xdrproc_t) xdr_void, (char *) NULL,
> -              (xdrproc_t) xdr_void, (char *) NULL) == -1)
> -        return -1;
> -
>      if (priv->eventFlushTimer >= 0) {
>          /* Remove timeout */
>          virEventRemoveTimeout(priv->eventFlushTimer);
> @@ -1431,6 +1426,11 @@ doRemoteClose (virConnectPtr conn, struct private_data *priv)
>          priv->watch = -1;
>      }
>  
> +    if (call (conn, priv, 0, REMOTE_PROC_CLOSE,
> +              (xdrproc_t) xdr_void, (char *) NULL,
> +              (xdrproc_t) xdr_void, (char *) NULL) == -1)
> +        return -1;
> +
>      /* Close socket. */
>      if (priv->uses_tls && priv->session) {
>          gnutls_bye (priv->session, GNUTLS_SHUT_RDWR);

Ah, nasty.  Good catch.

ACK

-- 
Chris Lalancette




More information about the libvir-list mailing list