Merge pull request #1960 from fufesou/fix_cm_crash

fix cm crash
This commit is contained in:
RustDesk 2022-11-04 19:04:05 +08:00 committed by GitHub
commit 884a223449
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -57,6 +57,8 @@ struct IpcTaskRunner<T: InvokeUiCM> {
tx: mpsc::UnboundedSender<Data>, tx: mpsc::UnboundedSender<Data>,
rx: mpsc::UnboundedReceiver<Data>, rx: mpsc::UnboundedReceiver<Data>,
close: bool, close: bool,
running: bool,
authorized: bool,
conn_id: i32, conn_id: i32,
#[cfg(windows)] #[cfg(windows)]
file_transfer_enabled: bool, file_transfer_enabled: bool,
@ -218,6 +220,7 @@ pub fn switch_permission(id: i32, name: String, enabled: bool) {
}; };
} }
#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))]
#[inline] #[inline]
pub fn get_clients_state() -> String { pub fn get_clients_state() -> String {
let clients = CLIENTS.read().unwrap(); let clients = CLIENTS.read().unwrap();
@ -273,7 +276,7 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
let mut rx_clip; let mut rx_clip;
let _tx_clip; let _tx_clip;
#[cfg(windows)] #[cfg(windows)]
if self.conn_id > 0 { if self.conn_id > 0 && self.authorized {
rx_clip1 = clipboard::get_rx_cliprdr_server(self.conn_id); rx_clip1 = clipboard::get_rx_cliprdr_server(self.conn_id);
rx_clip = rx_clip1.lock().await; rx_clip = rx_clip1.lock().await;
} else { } else {
@ -287,6 +290,7 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
(_tx_clip, rx_clip) = unbounded_channel::<i32>(); (_tx_clip, rx_clip) = unbounded_channel::<i32>();
} }
self.running = false;
loop { loop {
tokio::select! { tokio::select! {
res = self.stream.next() => { res = self.stream.next() => {
@ -300,11 +304,13 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
Data::Login{id, is_file_transfer, port_forward, peer_id, name, authorized, keyboard, clipboard, audio, file, file_transfer_enabled: _file_transfer_enabled, restart, recording} => { Data::Login{id, is_file_transfer, port_forward, peer_id, name, authorized, keyboard, clipboard, audio, file, file_transfer_enabled: _file_transfer_enabled, restart, recording} => {
log::debug!("conn_id: {}", id); log::debug!("conn_id: {}", id);
self.cm.add_connection(id, is_file_transfer, port_forward, peer_id, name, authorized, keyboard, clipboard, audio, file, restart, recording, self.tx.clone()); self.cm.add_connection(id, is_file_transfer, port_forward, peer_id, name, authorized, keyboard, clipboard, audio, file, restart, recording, self.tx.clone());
self.authorized = authorized;
self.conn_id = id; self.conn_id = id;
#[cfg(windows)] #[cfg(windows)]
{ {
self.file_transfer_enabled = _file_transfer_enabled; self.file_transfer_enabled = _file_transfer_enabled;
} }
self.running = true;
break; break;
} }
Data::Close => { Data::Close => {
@ -389,13 +395,14 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
tx, tx,
rx, rx,
close: true, close: true,
running: true,
authorized: false,
conn_id: 0, conn_id: 0,
#[cfg(windows)] #[cfg(windows)]
file_transfer_enabled: false, file_transfer_enabled: false,
}; };
task_runner.run().await; while task_runner.running {
if task_runner.conn_id > 0 {
task_runner.run().await; task_runner.run().await;
} }
if task_runner.conn_id > 0 { if task_runner.conn_id > 0 {