From ee34b237300dce79f675c4b3b6a3b1c4851de5a6 Mon Sep 17 00:00:00 2001 From: kurealnum Date: Thu, 11 Sep 2025 10:17:39 -0400 Subject: [PATCH] feat: handle WeakActorRef::upgrade() failure gracefully I'm 90% sure this is necessary. Either way, it's not a bad check to make --- crates/libtortillas/src/engine/actor.rs | 16 ++++++++++++++-- crates/libtortillas/src/peer/actor.rs | 8 +++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/crates/libtortillas/src/engine/actor.rs b/crates/libtortillas/src/engine/actor.rs index 88397d2..9853cc5 100644 --- a/crates/libtortillas/src/engine/actor.rs +++ b/crates/libtortillas/src/engine/actor.rs @@ -113,9 +113,15 @@ impl Actor for EngineActor { peer_stream = self.tcp_socket.accept() => match peer_stream { Ok((stream, _)) => { let peer_stream = Box::new(PeerStream::Tcp(stream)); + + let Some(actor_ref) = actor_ref.upgrade() else { + error!("Failed to upgrade weak actor reference"); + return None; + }; + Some(Signal::Message { message: Box::new(EngineMessage::IncomingPeer(peer_stream)), - actor_ref: actor_ref.upgrade().unwrap(), + actor_ref, reply: None, sent_within_actor: true, }) @@ -128,9 +134,15 @@ impl Actor for EngineActor { peer_stream = self.utp_socket.accept() => match peer_stream { Ok(stream) => { let peer_stream = Box::new(PeerStream::Utp(stream)); + + let Some(actor_ref) = actor_ref.upgrade() else { + error!("Failed to upgrade weak actor reference"); + return None; + }; + Some(Signal::Message { message: Box::new(EngineMessage::IncomingPeer(peer_stream)), - actor_ref: actor_ref.upgrade().unwrap(), + actor_ref, reply: None, sent_within_actor: true, }) diff --git a/crates/libtortillas/src/peer/actor.rs b/crates/libtortillas/src/peer/actor.rs index 621a302..6e52bd2 100644 --- a/crates/libtortillas/src/peer/actor.rs +++ b/crates/libtortillas/src/peer/actor.rs @@ -279,9 +279,15 @@ impl Actor for PeerActor { tokio::select! { signal = mailbox_rx.recv() => signal, msg = self.stream.recv() => { + + let Some(actor_ref) = actor_ref.upgrade() else { + error!("Failed to upgrade weak actor reference"); + return None; + }; + Some(Signal::Message { message: Box::new(msg.expect("PeerStream closed")), - actor_ref: actor_ref.upgrade().unwrap(), + actor_ref, reply: None, sent_within_actor: true, })