From 90c898f9c725258753788f9e3562b09f6b2d9bc8 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Sun, 16 Aug 2026 05:03:58 +1000 Subject: [PATCH] [client] lgmp: skip release after session loss Heartbeat expiry does not change the LGMP session ID. Queue operations can therefore accept ownership releases into stale shared memory after a guest reboot, where no host remains to advance the acknowledgement serial. Skip graceful clipboard and input ownership release when the session is already invalid. Keep the existing timeout and warning for a live host that fails to process the release. --- client/transports/LGMP/clipboard.c | 3 ++- client/transports/LGMP/input.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/client/transports/LGMP/clipboard.c b/client/transports/LGMP/clipboard.c index f5f32e13..2f87c8a6 100644 --- a/client/transports/LGMP/clipboard.c +++ b/client/transports/LGMP/clipboard.c @@ -2399,7 +2399,8 @@ bool lgmpClipboard_connect(LGMPClipboard * clipboard, uint32_t clientID) static void releaseOnDisconnect(LGMPClipboard * clipboard) { - if (!clipboard->queue || !clipboard->publishedClaimGeneration) + if (!clipboard->queue || !clipboard->publishedClaimGeneration || + !lgmpClientSessionValid(clipboard->client)) return; const KVMFRClipboardMessage release = diff --git a/client/transports/LGMP/input.c b/client/transports/LGMP/input.c index 3bc35459..e3e41a6c 100644 --- a/client/transports/LGMP/input.c +++ b/client/transports/LGMP/input.c @@ -907,7 +907,8 @@ static void logStats(const struct LGMPInputCounters * stats) static void releaseOnDisconnect(LGMPInput * input) { if (!input->queue || !input->stream || !input->publishedClaimed || - !input->publishedGeneration) + !input->publishedGeneration || + !lgmpClientSessionValid(input->client)) return; KVMFRInputMessage message =