From 4d835a51905fd539e9c4438a1e37de134369a7bb Mon Sep 17 00:00:00 2001 From: Ferdinand Schober Date: Sun, 3 Nov 2024 12:56:48 +0100 Subject: [PATCH] fix potential unterminated emulation session --- src/emulation.rs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/emulation.rs b/src/emulation.rs index 40be16f..6deb34d 100644 --- a/src/emulation.rs +++ b/src/emulation.rs @@ -291,11 +291,11 @@ impl EmulationProxy { ); // create active handles - for &handle in handles.values() { - tokio::select! { - _ = emulation.create(handle) => {}, - _ = wait_for_termination(request_rx) => return Ok(()), - } + if let Err(e) = + Self::create_clients(&mut emulation, handles.values().copied(), request_rx).await + { + emulation.terminate().await; + return Err(e); } let res = Self::do_emulation_session(&mut emulation, handles, next_id, request_rx).await; @@ -304,6 +304,20 @@ impl EmulationProxy { res } + async fn create_clients( + emulation: &mut InputEmulation, + handles: impl Iterator, + request_rx: &mut Receiver, + ) -> Result<(), InputEmulationError> { + for handle in handles { + tokio::select! { + _ = emulation.create(handle) => {}, + _ = wait_for_termination(request_rx) => return Ok(()), + } + } + Ok(()) + } + async fn do_emulation_session( emulation: &mut InputEmulation, handles: &mut HashMap,