From 3ffa057d0355c8a1aa230583b58f58b9a5824357 Mon Sep 17 00:00:00 2001 From: ospab Date: Thu, 21 May 2026 18:24:48 +0300 Subject: [PATCH] fix(client): fix catastrophic channel loopback in UoT transport that echoed packets locally --- ostp-client/src/transport/xhttp.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ostp-client/src/transport/xhttp.rs b/ostp-client/src/transport/xhttp.rs index 15cdc9c..5ecf48d 100644 --- a/ostp-client/src/transport/xhttp.rs +++ b/ostp-client/src/transport/xhttp.rs @@ -93,13 +93,12 @@ where R: tokio::io::AsyncRead + Unpin + Send + 'static, W: tokio::io::AsyncWrite + Unpin + Send + 'static, { - let (app_tx, bridge_rx) = mpsc::channel::(1024); - let (bridge_tx, app_rx) = mpsc::channel::(1024); + let (app_tx, mut tx_rx) = mpsc::channel::(1024); + let (rx_tx, app_rx) = mpsc::channel::(1024); // TX Loop (App -> UoT -> Network): prefix each frame with u16 BE length tokio::spawn(async move { - let mut rx = bridge_rx; - while let Some(frame) = rx.recv().await { + while let Some(frame) = tx_rx.recv().await { let len = frame.len() as u16; if net_tx.write_u16(len).await.is_err() { break; } if net_tx.write_all(&frame).await.is_err() { break; } @@ -128,11 +127,11 @@ where } let packet = buffer.split_to(2 + len); - if app_tx.send(Bytes::from(packet[2..].to_vec())).await.is_err() { + if rx_tx.send(Bytes::from(packet[2..].to_vec())).await.is_err() { break; } } }); - Ok((bridge_tx, Arc::new(tokio::sync::Mutex::new(app_rx)))) + Ok((app_tx, Arc::new(tokio::sync::Mutex::new(app_rx)))) }