mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-25 01:34:11 +03:00
rpc: Avoid deadlock when closing client connection
We need to drop the server lock before calling virObjectUnlock(client) since in case we had the last reference to the client, its dispose callback would be called and that could possibly try to lock the server and cause a deadlock. This is exactly what happens when there is only one QEMU domain running and it is marked to be autodestroyed when the connection dies. This results in qemuProcessAutoDestroy -> qemuProcessStop -> virNetServerRemoveShutdownInhibition call sequence, where the last function locks the server.
This commit is contained in:
parent
ee1d6d91d1
commit
921af42980
@ -1120,7 +1120,7 @@ void virNetServerRun(virNetServerPtr srv)
|
||||
if (virNetServerClientWantClose(srv->clients[i]))
|
||||
virNetServerClientClose(srv->clients[i]);
|
||||
if (virNetServerClientIsClosed(srv->clients[i])) {
|
||||
virObjectUnref(srv->clients[i]);
|
||||
virNetServerClientPtr client = srv->clients[i];
|
||||
if (srv->nclients > 1) {
|
||||
memmove(srv->clients + i,
|
||||
srv->clients + i + 1,
|
||||
@ -1131,6 +1131,10 @@ void virNetServerRun(virNetServerPtr srv)
|
||||
srv->nclients = 0;
|
||||
}
|
||||
|
||||
virObjectUnlock(srv);
|
||||
virObjectUnref(client);
|
||||
virObjectLock(srv);
|
||||
|
||||
goto reprocess;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user