🐛 bug: fix crash when trying to open the same port twice

main
_ 2021-10-10 18:17:50 +00:00
parent baa5044186
commit e4285ec17d
2 changed files with 15 additions and 12 deletions

View File

@ -53,10 +53,12 @@ impl GuiClient <'_> {
let params = self.gui_ports [port_idx].get_params ()?;
let _guard = self.rt.enter ();
self.forwarding_instances [port_idx].replace (ForwardingInstance::new (
let forwarding_instance = self.rt.block_on (ForwardingInstance::new (
connection_p2_p3,
params,
));
))?;
self.forwarding_instances [port_idx].replace (forwarding_instance);
self.gui_ports [port_idx].set_forwarding (true);
self.sync_status ();
@ -259,9 +261,9 @@ impl GuiPort {
input_server_id.set_value ("bogus_server");
input_server_port.set_value ("5900");
but_open.set_trigger (CallbackTrigger::Changed);
but_open.set_trigger (CallbackTrigger::Release);
but_open.emit (fltk_tx, Message::OpenPort (port_idx));
but_close.set_trigger (CallbackTrigger::Changed);
but_close.set_trigger (CallbackTrigger::Release);
but_close.emit (fltk_tx, Message::ClosePort (port_idx));
set_active (&mut but_open, true);

View File

@ -12,23 +12,27 @@ pub struct ForwardingInstance {
}
impl ForwardingInstance {
pub fn new (
pub async fn new (
connection_p2_p3: quinn::Connection,
params: ForwardingParams,
) -> Self
) -> anyhow::Result <Self>
{
let (shutdown_flag, shutdown_flag_rx) = tokio::sync::watch::channel (true);
let listener = TcpListener::bind (("127.0.0.1", params.client_tcp_port)).await?;
trace! ("Accepting local TCP connections from P1 on {}", params.client_tcp_port);
let task = tokio::spawn (forward_port (
listener,
connection_p2_p3,
params,
shutdown_flag_rx
));
Self {
Ok (Self {
task,
shutdown_flag,
}
})
}
pub async fn close (self) -> anyhow::Result <()> {
@ -53,6 +57,7 @@ pub struct ForwardingParams {
/// the same client:server port combination
pub async fn forward_port (
listener: TcpListener,
connection_p2_p3: quinn::Connection,
params: ForwardingParams,
mut shutdown_flag_rx: tokio::sync::watch::Receiver <bool>,
@ -64,10 +69,6 @@ pub async fn forward_port (
server_tcp_port,
} = params;
let listener = TcpListener::bind (("127.0.0.1", client_tcp_port)).await?;
trace! ("Accepting local TCP connections from P1 on {}", client_tcp_port);
while *shutdown_flag_rx.borrow () {
tokio::select! {
x = listener.accept () => {