diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-03-08 16:22:21 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-03-13 17:49:30 +0100 |
| commit | 9c04bde75ed4371f1d01f0796b7ea364b6f9631b (patch) | |
| tree | 5d7baa0efd6a49690907d85b5fa737fce648a985 | |
| parent | 3a8d4bfc7c8cba5493e0d0aa812f1e2397fa4972 (diff) | |
| download | mullvadvpn-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.rs | 18 |
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) } |
