diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-05-07 16:05:45 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-07-02 09:54:19 +0200 |
| commit | 7566f6339d7f463a58000a463090c5e9263f9e33 (patch) | |
| tree | 5aef0cdf8fc6291ab6d106605e759fd7f5e966e3 | |
| parent | 22aeda50600fda08c86504d4430f7e6ca641d92e (diff) | |
| download | mullvadvpn-7566f6339d7f463a58000a463090c5e9263f9e33.tar.xz mullvadvpn-7566f6339d7f463a58000a463090c5e9263f9e33.zip | |
Remove unwrapping from Try impl
| -rw-r--r-- | talpid-core/src/split_tunnel/windows/mod.rs | 24 | ||||
| -rw-r--r-- | talpid-core/src/winnet.rs | 30 |
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, |
