From efd74baa950133de6ed92b7395be6d14ef63a58e Mon Sep 17 00:00:00 2001 From: Rainer Toebbicke Date: Tue, 20 Jun 2006 15:50:17 +0000 Subject: [PATCH] viced-deadlock-20060620 FIXES 34073 * checks for client == oldClient * drops the H_LOCK prior to obtaining the WriteLock on oldClient in order to prevent a deadlock --- src/viced/host.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/viced/host.c b/src/viced/host.c index 6f1c559120..0d5447b34f 100644 --- a/src/viced/host.c +++ b/src/viced/host.c @@ -1796,7 +1796,7 @@ h_FindClient_r(struct rx_connection *tcon) * the RPC from the other client structure's rock. */ oldClient = (struct client *)rx_GetSpecific(tcon, rxcon_client_key); - if (oldClient && oldClient->sid == rxr_CidOf(tcon) + if (oldClient && oldClient != client && oldClient->sid == rxr_CidOf(tcon) && oldClient->VenusEpoch == rxr_GetEpoch(tcon)) { char hoststr[16]; if (!oldClient->deleted) { @@ -1819,8 +1819,10 @@ h_FindClient_r(struct rx_connection *tcon) FreeCE(client); created = 0; } - ObtainWriteLock(&oldClient->lock); oldClient->refCount++; + H_UNLOCK; + ObtainWriteLock(&oldClient->lock); + H_LOCK; client = oldClient; } else { ViceLog(0, ("FindClient: deleted client %x(%x) already had conn %x (host %s:%d), stolen by client %x(%x)\n",