diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-11-19 15:38:32 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-11-29 17:39:11 +0100 |
| commit | cd439ad95ce2e06ff88499c1c5cf33018f30ce0a (patch) | |
| tree | 61d416edb2cb7e39e92338c27734ca2847d0ece5 /talpid-core/src | |
| parent | f42798e6bff9a4acefca3982307458b5ab474f70 (diff) | |
| download | mullvadvpn-cd439ad95ce2e06ff88499c1c5cf33018f30ce0a.tar.xz mullvadvpn-cd439ad95ce2e06ff88499c1c5cf33018f30ce0a.zip | |
Pass interface by LUID instead of alias to WinDns
Diffstat (limited to 'talpid-core/src')
| -rw-r--r-- | talpid-core/src/dns/windows/mod.rs | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/talpid-core/src/dns/windows/mod.rs b/talpid-core/src/dns/windows/mod.rs index 42ca632e92..d3e22111cd 100644 --- a/talpid-core/src/dns/windows/mod.rs +++ b/talpid-core/src/dns/windows/mod.rs @@ -1,10 +1,14 @@ -use crate::logging::windows::{log_sink, LogSink}; +use crate::{ + logging::windows::{log_sink, LogSink}, + windows::luid_from_alias, +}; use lazy_static::lazy_static; use log::{error, trace, warn}; use std::{env, io, net::IpAddr, path::Path}; use talpid_types::ErrorExt; use widestring::WideCString; +use winapi::shared::ifdef::NET_LUID; use winreg::{ enums::{HKEY_LOCAL_MACHINE, REG_MULTI_SZ}, transaction::Transaction, @@ -22,6 +26,7 @@ lazy_static! { /// Errors that can happen when configuring DNS on Windows. #[derive(err_derive::Error, Debug)] +#[error(no_from)] pub enum Error { /// Failure to initialize WinDns. #[error(display = "Failed to initialize WinDns")] @@ -35,6 +40,10 @@ pub enum Error { #[error(display = "Failed to set new DNS servers on interface")] Setting, + /// Failure to obtain an interface LUID given an alias. + #[error(display = "Failed to obtain LUID for the interface alias")] + InterfaceLuidError(#[error(source)] io::Error), + /// Failure to set new DNS servers. #[error(display = "Failed to update dnscache policy config")] UpdateDnsCachePolicy(#[error(source)] io::Error), @@ -78,9 +87,11 @@ impl super::DnsMonitorT for DnsMonitor { trace!("ipv4 ips - {:?} - {}", ipv4, ipv4.len()); trace!("ipv6 ips - {:?} - {}", ipv6, ipv6.len()); + let luid = luid_from_alias(interface).map_err(Error::InterfaceLuidError)?; + unsafe { WinDns_Set( - WideCString::from_str(interface).unwrap().as_ptr(), + &luid, ipv4_address_ptrs.as_mut_ptr(), ipv4_address_ptrs.len() as u32, ipv6_address_ptrs.as_mut_ptr(), @@ -132,20 +143,15 @@ impl Drop for DnsMonitor { } fn set_dns_cache_policy(servers: &[IpAddr]) -> Result<(), Error> { - let transaction = Transaction::new()?; - match set_dns_cache_policy_inner(&transaction, servers) { - Ok(()) => { - transaction.commit()?; - Ok(()) - } - Err(error) => { - transaction.rollback()?; - Err(error) - } - } + let transaction = Transaction::new().map_err(Error::UpdateDnsCachePolicy)?; + let result = match set_dns_cache_policy_inner(&transaction, servers) { + Ok(()) => transaction.commit(), + Err(error) => transaction.rollback().and_then(|_| Err(error)), + }; + result.map_err(Error::UpdateDnsCachePolicy) } -fn set_dns_cache_policy_inner(transaction: &Transaction, servers: &[IpAddr]) -> Result<(), Error> { +fn set_dns_cache_policy_inner(transaction: &Transaction, servers: &[IpAddr]) -> io::Result<()> { let (dns_cache_parameters, _) = RegKey::predef(HKEY_LOCAL_MACHINE).create_subkey_transacted( r#"SYSTEM\CurrentControlSet\Services\DnsCache\Parameters"#, transaction, @@ -178,7 +184,8 @@ fn set_dns_cache_policy_inner(transaction: &Transaction, servers: &[IpAddr]) -> fn reset_dns_cache_policy() -> Result<(), Error> { let (dns_cache_parameters, _) = RegKey::predef(HKEY_LOCAL_MACHINE) - .create_subkey(r#"SYSTEM\CurrentControlSet\Services\DnsCache\Parameters"#)?; + .create_subkey(r#"SYSTEM\CurrentControlSet\Services\DnsCache\Parameters"#) + .map_err(Error::UpdateDnsCachePolicy)?; match dns_cache_parameters.delete_value("DnsSecureNameQueryFallback") { Ok(()) => Ok(()), Err(error) => { @@ -236,7 +243,7 @@ extern "stdcall" { // Configure which DNS servers should be used and start enforcing these settings. #[link_name = "WinDns_Set"] pub fn WinDns_Set( - interface_alias: *const u16, + interface_luid: *const NET_LUID, v4_ips: *mut *const u16, v4_n_ips: u32, v6_ips: *mut *const u16, |
