Skip to content

Commit a70e01d

Browse files
authored
fix(server): send TLS close_notify during graceful RDP disconnect (#1032)
Add support for sending a proper TLS close_notify message when the RDP client initiates a graceful disconnect PDU.
1 parent f2326ef commit a70e01d

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

crates/ironrdp-server/src/server.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use ironrdp_pdu::{decode_err, mcs, nego, rdp, Action, PduResult};
2121
use ironrdp_svc::{server_encode_svc_messages, StaticChannelId, StaticChannelSet, SvcProcessor};
2222
use ironrdp_tokio::{split_tokio_framed, unsplit_tokio_framed, FramedRead, FramedWrite, TokioFramed};
2323
use rdpsnd::server::{RdpsndServer, RdpsndServerMessage};
24-
use tokio::io::{AsyncRead, AsyncWrite};
24+
use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt as _};
2525
use tokio::net::{TcpListener, TcpStream};
2626
use tokio::sync::{mpsc, oneshot, Mutex};
2727
use tokio::task;
@@ -357,7 +357,12 @@ impl RdpServer {
357357
.await?;
358358
}
359359

360-
self.accept_finalize(framed, acceptor).await?;
360+
let framed = self.accept_finalize(framed, acceptor).await?;
361+
debug!("Shutting down TLS connection");
362+
let (mut tls_stream, _) = framed.into_inner();
363+
if let Err(e) = tls_stream.shutdown().await {
364+
debug!(?e, "TLS shutdown error");
365+
}
361366
}
362367

363368
BeginResult::Continue(framed) => {
@@ -954,7 +959,7 @@ impl RdpServer {
954959
}
955960
}
956961

957-
async fn accept_finalize<S>(&mut self, mut framed: TokioFramed<S>, mut acceptor: Acceptor) -> Result<()>
962+
async fn accept_finalize<S>(&mut self, mut framed: TokioFramed<S>, mut acceptor: Acceptor) -> Result<TokioFramed<S>>
958963
where
959964
S: AsyncRead + AsyncWrite + Sync + Send + Unpin,
960965
{
@@ -982,11 +987,12 @@ impl RdpServer {
982987
framed = unsplit_tokio_framed(reader, writer);
983988
continue;
984989
}
985-
RunState::Disconnect => break,
990+
RunState::Disconnect => {
991+
let final_framed = unsplit_tokio_framed(reader, writer);
992+
return Ok(final_framed);
993+
}
986994
}
987995
}
988-
989-
Ok(())
990996
}
991997

992998
pub fn set_credentials(&mut self, creds: Option<Credentials>) {

0 commit comments

Comments
 (0)