summaryrefslogtreecommitdiffhomepage
path: root/talpid-core/src
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-11-19 15:38:32 +0100
committerDavid Lönnhager <david.l@mullvad.net>2021-11-29 17:39:11 +0100
commitcd439ad95ce2e06ff88499c1c5cf33018f30ce0a (patch)
tree61d416edb2cb7e39e92338c27734ca2847d0ece5 /talpid-core/src
parentf42798e6bff9a4acefca3982307458b5ab474f70 (diff)
downloadmullvadvpn-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.rs39
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,