Closed kdheepak closed 9 months ago
I added some log::info! statements and was able to trace the crash down to a panic! instead of a thread spawned inside start_loop:
log::info!
panic!
start_loop
fn start_loop(&mut self) { if self.loop_thread.is_none() { let tx = self.action_tx.clone().unwrap(); let interface = self.active_interface.clone().unwrap(); let t_handle = thread::spawn(move || { log::info!("Inside thread"); Self::t_logic(tx, interface); }); self.loop_thread = Some(t_handle); } }
Instead of panic!, I think you can use tx.send(Action::Error(msg)) over the channel, e.g.:
tx.send(Action::Error(msg))
diff --git a/src/components/packetdump.rs b/src/components/packetdump.rs index 2c2f3dd..451410a 100644 --- a/src/components/packetdump.rs +++ b/src/components/packetdump.rs @@ -90,13 +91,23 @@ impl PacketDump { } fn t_logic(tx: UnboundedSender<Action>, interface: NetworkInterface) { let (_, mut receiver) = match pnet::datalink::channel(&interface, Default::default()) { Ok(Channel::Ethernet(tx, rx)) => (tx, rx), - Ok(_) => panic!("Unknown channel type"), - Err(e) => panic!("Error happened {}", e), + Ok(_) => { + let _ = tx.send(Action::Error("Unable to create pnet datalink".into())); + return; + } + Err(e) => { + let _ = tx.send(Action::Error(format!( + "Unable to create pnet datalink: {e}" + ))); + return; + } }; loop { let mut buf: [u8; 1600] = [0u8; 1600]; let mut fake_ethernet_frame = MutableEthernetPacket::new(&mut buf[..]).unwrap(); match receiver.next() {
And then you can handle that action with a popup or a notification or exit the app gracefully in ./src/app.rs.
./src/app.rs
Yeah, I should cover somehow better those panics for a graceful exit. Thank You for Your suggestion @kdheepak. That's a nice solution. I will address that in the next version.
Added fix here: https://github.com/Chleba/netscanner/commit/28caa78ae3a8a499bf95128cc11f3bea393e3e78
I added some
log::info!
statements and was able to trace the crash down to apanic!
instead of a thread spawned insidestart_loop
:Instead of
panic!
, I think you can usetx.send(Action::Error(msg))
over the channel, e.g.:And then you can handle that action with a popup or a notification or exit the app gracefully in
./src/app.rs
.