On 9/21/26 17:25, Denis V. Lunev via Devel wrote:
> daemonStreamEvent() holds priv->lock across its whole body and closes
> the client from every error path. The close hook runs in the same
> thread and takes priv->lock again, so the daemon main loop deadlocks
> against itself and the host stops answering RPC entirely while its
> guests keep running. Only a restart of the daemon recovers.
> 
> We hit this in the field on 9.5.0, and current master is affected the
> same way. Getting there needs a client already marked wantClose while
> one of its streams still delivers events, which is presumably why it
> has gone unnoticed since 9.2.0.
> 
> Patch 1 closes the client after the lock guard has gone out of scope.
> Patch 2 adds a test for it, which needs remote_daemon_stream.c compiled
> into a test binary; that is the only build change and it pulls in the
> generated protocol headers via remote_daemon.h. The test deadlocks
> without patch 1 and passes with it.
> 
> Signed-off-by: Denis V. Lunev <[email protected]>
> 
> Denis V. Lunev (2):
>   remote: fix daemon deadlock when a stream event closes its client
>   tests: add daemonstreamtest covering the stream close deadlock
> 
>  src/remote/meson.build            |   7 +-
>  src/remote/remote_daemon_stream.c |  58 ++++----
>  tests/daemonstreamtest.c          | 212 ++++++++++++++++++++++++++++++
>  tests/meson.build                 |   9 ++
>  4 files changed, 262 insertions(+), 24 deletions(-)
>  create mode 100644 tests/daemonstreamtest.c
> 
> 
> base-commit: 91d4618734bd6d02174b909aadb7d84a99560ebe

Reviewed-by: Michal Privoznik <[email protected]>

and merged.

Michal

Reply via email to