FIXES 34073
* checks for client == oldClient
* drops the H_LOCK prior to obtaining the WriteLock on oldClient
in order to prevent a deadlock
(cherry picked from commit
efd74baa950133de6ed92b7395be6d14ef63a58e)
* 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) {
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",