[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