summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-05-07 16:05:45 +0200
committerDavid Lönnhager <david.l@mullvad.net>2021-07-02 09:54:19 +0200
commit7566f6339d7f463a58000a463090c5e9263f9e33 (patch)
tree5aef0cdf8fc6291ab6d106605e759fd7f5e966e3
parent22aeda50600fda08c86504d4430f7e6ca641d92e (diff)
downloadmullvadvpn-7566f6339d7f463a58000a463090c5e9263f9e33.tar.xz
mullvadvpn-7566f6339d7f463a58000a463090c5e9263f9e33.zip
Remove unwrapping from Try impl
-rw-r--r--talpid-core/src/split_tunnel/windows/mod.rs24
-rw-r--r--talpid-core/src/winnet.rs30
2 files changed, 31 insertions, 23 deletions
diff --git a/talpid-core/src/split_tunnel/windows/mod.rs b/talpid-core/src/split_tunnel/windows/mod.rs
index bf7ef40ee6..8a4301c42d 100644
--- a/talpid-core/src/split_tunnel/windows/mod.rs
+++ b/talpid-core/src/split_tunnel/windows/mod.rs
@@ -11,6 +11,7 @@ use crate::{
use futures::channel::mpsc;
use lazy_static::lazy_static;
use std::{
+ convert::TryFrom,
ffi::OsStr,
io, mem,
net::{IpAddr, Ipv4Addr, Ipv6Addr},
@@ -71,6 +72,10 @@ pub enum Error {
/// Failed to set up callback for monitoring default route changes
#[error(display = "Failed to register default route change callback")]
RegisterRouteChangeCallback,
+
+ /// Unexpected IP parsing error
+ #[error(display = "Failed to parse IP address")]
+ IpParseError,
}
/// Manages applications whose traffic to exclude from the tunnel.
@@ -302,8 +307,11 @@ impl SplitTunnel {
.flatten();
let tunnel_ipv4 = tunnel_ipv4.unwrap_or(*RESERVED_IP_V4);
- let internet_ipv4 = Ipv4Addr::from(internet_ipv4.unwrap_or_default());
- let internet_ipv6 = internet_ipv6.map(|addr| Ipv6Addr::from(addr));
+ let internet_ipv4 = Ipv4Addr::try_from(internet_ipv4.unwrap_or_default())
+ .map_err(|_| Error::IpParseError)?;
+ let internet_ipv6 = internet_ipv6
+ .map(|addr| Ipv6Addr::try_from(addr).map_err(|_| Error::IpParseError))
+ .transpose()?;
let context = SplitTunnelDefaultRouteChangeHandlerContext::new(
self.handle.clone(),
@@ -478,15 +486,9 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler(
}
};
- match address_family {
- WinNetAddrFamily::IPV4 => {
- let ip = Ipv4Addr::from(ip);
- ctx.internet_ipv4 = ip;
- }
- WinNetAddrFamily::IPV6 => {
- let ip = Ipv6Addr::from(ip);
- ctx.internet_ipv6 = Some(ip);
- }
+ match IpAddr::from(ip) {
+ IpAddr::V4(addr) => ctx.internet_ipv4 = addr,
+ IpAddr::V6(addr) => ctx.internet_ipv6 = Some(addr),
}
ctx.register_ips()
diff --git a/talpid-core/src/winnet.rs b/talpid-core/src/winnet.rs
index 8b3d503462..4f71fa0040 100644
--- a/talpid-core/src/winnet.rs
+++ b/talpid-core/src/winnet.rs
@@ -4,6 +4,7 @@ use crate::{logging::windows::log_sink, routing::Node};
use ipnetwork::IpNetwork;
use libc::c_void;
use std::{
+ convert::TryFrom,
net::{IpAddr, Ipv4Addr, Ipv6Addr},
ptr,
};
@@ -122,24 +123,31 @@ pub struct WinNetDefaultRoute {
pub gateway: WinNetIp,
}
-impl From<WinNetIp> for Ipv4Addr {
- fn from(addr: WinNetIp) -> Ipv4Addr {
+#[derive(Debug)]
+pub struct WrongIpFamilyError;
+
+impl TryFrom<WinNetIp> for Ipv4Addr {
+ type Error = WrongIpFamilyError;
+
+ fn try_from(addr: WinNetIp) -> Result<Ipv4Addr, WrongIpFamilyError> {
match addr.addr_family {
WinNetAddrFamily::IPV4 => {
let mut bytes: [u8; 4] = Default::default();
bytes.clone_from_slice(&addr.ip_bytes[..4]);
- Ipv4Addr::from(bytes)
+ Ok(Ipv4Addr::from(bytes))
}
- WinNetAddrFamily::IPV6 => panic!("address family mismatch"),
+ WinNetAddrFamily::IPV6 => Err(WrongIpFamilyError),
}
}
}
-impl From<WinNetIp> for Ipv6Addr {
- fn from(addr: WinNetIp) -> Ipv6Addr {
+impl TryFrom<WinNetIp> for Ipv6Addr {
+ type Error = WrongIpFamilyError;
+
+ fn try_from(addr: WinNetIp) -> Result<Ipv6Addr, WrongIpFamilyError> {
match addr.addr_family {
- WinNetAddrFamily::IPV4 => panic!("address family mismatch"),
- WinNetAddrFamily::IPV6 => Ipv6Addr::from(addr.ip_bytes),
+ WinNetAddrFamily::IPV4 => Err(WrongIpFamilyError),
+ WinNetAddrFamily::IPV6 => Ok(Ipv6Addr::from(addr.ip_bytes)),
}
}
}
@@ -147,8 +155,8 @@ impl From<WinNetIp> for Ipv6Addr {
impl From<WinNetIp> for IpAddr {
fn from(addr: WinNetIp) -> IpAddr {
match addr.addr_family {
- WinNetAddrFamily::IPV4 => IpAddr::V4(Ipv4Addr::from(addr)),
- WinNetAddrFamily::IPV6 => IpAddr::V6(Ipv6Addr::from(addr)),
+ WinNetAddrFamily::IPV4 => IpAddr::V4(Ipv4Addr::try_from(addr).unwrap()),
+ WinNetAddrFamily::IPV6 => IpAddr::V6(Ipv6Addr::try_from(addr).unwrap()),
}
}
}
@@ -381,8 +389,6 @@ pub fn get_best_default_route(
}
}
-// TODO: Remove attribute once this is in use.
-#[allow(dead_code)]
pub fn interface_luid_to_ip(
family: WinNetAddrFamily,
luid: u64,