summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2024-03-08 16:22:21 +0100
committerDavid Lönnhager <david.l@mullvad.net>2024-03-13 17:49:30 +0100
commit9c04bde75ed4371f1d01f0796b7ea364b6f9631b (patch)
tree5d7baa0efd6a49690907d85b5fa737fce648a985
parent3a8d4bfc7c8cba5493e0d0aa812f1e2397fa4972 (diff)
downloadmullvadvpn-9c04bde75ed4371f1d01f0796b7ea364b6f9631b.tar.xz
mullvadvpn-9c04bde75ed4371f1d01f0796b7ea364b6f9631b.zip
Recreate routing socket if it has been shut down while reading
-rw-r--r--talpid-routing/src/unix/macos/watch.rs18
1 files changed, 13 insertions, 5 deletions
diff --git a/talpid-routing/src/unix/macos/watch.rs b/talpid-routing/src/unix/macos/watch.rs
index 7c0f68ccd0..70271a85d4 100644
--- a/talpid-routing/src/unix/macos/watch.rs
+++ b/talpid-routing/src/unix/macos/watch.rs
@@ -46,11 +46,19 @@ impl RoutingTable {
pub async fn next_message(&mut self) -> Result<RouteSocketMessage> {
let mut buf = [0u8; 2048];
- let bytes_read = self
- .socket
- .recv_msg(&mut buf)
- .await
- .map_err(Error::RoutingSocket)?;
+
+ let bytes_read = loop {
+ match self.socket.recv_msg(&mut buf).await {
+ Ok(bytes_read) => break bytes_read,
+ Err(error) if error.is_shutdown() => {
+ log::debug!("Recreating shut down socket");
+ self.socket =
+ routing_socket::RoutingSocket::new().map_err(Error::RoutingSocket)?;
+ }
+ Err(error) => return Err(Error::RoutingSocket(error)),
+ }
+ };
+
let msg_buf = &buf[0..bytes_read];
data::RouteSocketMessage::parse_message(msg_buf).map_err(Error::InvalidMessage)
}