diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-05-14 13:19:36 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-07-02 09:54:19 +0200 |
| commit | 1beccd0cb439220c49e21e0203603e4428a6e42c (patch) | |
| tree | 2d8da859e7a37dbac1b5124b998686408aeb9a7d | |
| parent | 8fc9710ae65abc5b13fe9d3a1abd785e3c0ed7dd (diff) | |
| download | mullvadvpn-1beccd0cb439220c49e21e0203603e4428a6e42c.tar.xz mullvadvpn-1beccd0cb439220c49e21e0203603e4428a6e42c.zip | |
Treat default route as non-existent if interface IP lookup fails
| -rw-r--r-- | talpid-core/src/split_tunnel/windows/mod.rs | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/talpid-core/src/split_tunnel/windows/mod.rs b/talpid-core/src/split_tunnel/windows/mod.rs index 8a4301c42d..d5710d2d71 100644 --- a/talpid-core/src/split_tunnel/windows/mod.rs +++ b/talpid-core/src/split_tunnel/windows/mod.rs @@ -467,30 +467,34 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler( let result = match event_type { winnet::WinNetDefaultRouteChangeEventType::DefaultRouteChanged => { - let ip = interface_luid_to_ip(address_family.clone(), default_route.interface_luid); - - let ip = match ip { - Ok(Some(ip)) => ip, + match interface_luid_to_ip(address_family.clone(), default_route.interface_luid) { + Ok(Some(ip)) => match IpAddr::from(ip) { + IpAddr::V4(addr) => ctx.internet_ipv4 = addr, + IpAddr::V6(addr) => ctx.internet_ipv6 = Some(addr), + }, Ok(None) => { - log::error!("Failed to obtain new default route address: none found",); - maybe_send(TunnelCommand::Block(ErrorStateCause::SplitTunnelError)); - return; + log::warn!("Failed to obtain default route interface address"); + match address_family { + WinNetAddrFamily::IPV4 => { + ctx.internet_ipv4 = Ipv4Addr::new(0, 0, 0, 0); + } + WinNetAddrFamily::IPV6 => { + ctx.internet_ipv6 = None; + } + } } Err(error) => { log::error!( "{}", - error.display_chain_with_msg("Failed to obtain new default route address") + error.display_chain_with_msg( + "Failed to obtain default route interface address" + ) ); maybe_send(TunnelCommand::Block(ErrorStateCause::SplitTunnelError)); return; } }; - match IpAddr::from(ip) { - IpAddr::V4(addr) => ctx.internet_ipv4 = addr, - IpAddr::V6(addr) => ctx.internet_ipv6 = Some(addr), - } - ctx.register_ips() } // no default route |
