summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-05-14 13:19:36 +0200
committerDavid Lönnhager <david.l@mullvad.net>2021-07-02 09:54:19 +0200
commit1beccd0cb439220c49e21e0203603e4428a6e42c (patch)
tree2d8da859e7a37dbac1b5124b998686408aeb9a7d
parent8fc9710ae65abc5b13fe9d3a1abd785e3c0ed7dd (diff)
downloadmullvadvpn-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.rs30
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