diff options
| author | Emīls Piņķis <emils@mullvad.net> | 2018-10-08 17:29:18 +0100 |
|---|---|---|
| committer | Emīls Piņķis <emils@mullvad.net> | 2018-10-09 13:49:40 +0100 |
| commit | edcc59760a5ecedee6fe2bb560ccfb157539396b (patch) | |
| tree | 85d65c1e9ff11afa811089ab58a0de66df36034e | |
| parent | c231604e1b4fa1bb9e7e7a1a3b254892e22ddcfc (diff) | |
| download | mullvadvpn-edcc59760a5ecedee6fe2bb560ccfb157539396b.tar.xz mullvadvpn-edcc59760a5ecedee6fe2bb560ccfb157539396b.zip | |
Fix resolved by always resolving interface names to real IDs.
| -rw-r--r-- | CHANGELOG.md | 4 | ||||
| -rw-r--r-- | talpid-core/src/security/linux/dns/systemd_resolved.rs | 50 |
2 files changed, 23 insertions, 31 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 146635e87f..49b695afb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,10 @@ Line wrap the file at 100 chars. Th - The app will have it's window resized correctly when display scaling settings are changed. This should also fix bad window behaviour on startup. +### Fixed +#### Linux +- Fixed systemd-resolved DNS management. + ## [2018.4-beta2] - 2018-10-08 ### Added diff --git a/talpid-core/src/security/linux/dns/systemd_resolved.rs b/talpid-core/src/security/linux/dns/systemd_resolved.rs index e5aea9a0de..5c416187fd 100644 --- a/talpid-core/src/security/linux/dns/systemd_resolved.rs +++ b/talpid-core/src/security/linux/dns/systemd_resolved.rs @@ -1,6 +1,5 @@ extern crate dbus; -use std::collections::HashMap; use std::net::IpAddr; use error_chain::ChainedError; @@ -54,7 +53,7 @@ lazy_static! { pub struct SystemdResolved { dbus_connection: dbus::Connection, - interface_links: HashMap<String, dbus::Path<'static>>, + interface_link: Option<(String, dbus::Path<'static>)>, } impl SystemdResolved { @@ -63,7 +62,7 @@ impl SystemdResolved { dbus::Connection::get_private(BusType::System).chain_err(|| ErrorKind::DBusError)?; let systemd_resolved = SystemdResolved { dbus_connection, - interface_links: HashMap::new(), + interface_link: None, }; systemd_resolved.ensure_resolved_exists()?; @@ -94,23 +93,17 @@ impl SystemdResolved { } pub fn set_dns(&mut self, interface_name: &str, servers: &[IpAddr]) -> Result<()> { - let new_entry = if let Some(link_object_path) = self.interface_links.get(interface_name) { - self.set_link_dns(&link_object_path, servers)?; - - None - } else { - let link_object_path = self.fetch_link(interface_name)?; - - self.set_link_dns(&link_object_path, servers)?; - - Some((interface_name.to_owned(), link_object_path)) - }; - - if let Some((interface_name, link_object_path)) = new_entry { - self.interface_links - .insert(interface_name, link_object_path); + let link_object_path = self.fetch_link(interface_name)?; + if let Err(e) = self.reset() { + debug!( + "Failed to reset previous DNS settings - {}", + e.display_chain() + ); } + self.set_link_dns(&link_object_path, servers)?; + self.interface_link = Some((interface_name.to_string(), link_object_path)); + Ok(()) } @@ -151,23 +144,18 @@ impl SystemdResolved { } pub fn reset(&mut self) -> Result<()> { - let mut result = Ok(()); - let interface_links: Vec<_> = self.interface_links.drain().collect(); - - for (interface_name, link_object_path) in interface_links { - if let Err(error) = self.revert_link(link_object_path, &interface_name) { - let chained_error = error.chain_err(|| { + if let Some((interface_name, link_object_path)) = self.interface_link.take() { + self.revert_link(link_object_path, &interface_name) + .chain_err(|| { format!( "Failed to revert DNS settings of interface: {}", interface_name ) - }); - error!("{}", chained_error.display_chain()); - result = Err(Error::from(ErrorKind::RevertDnsError)); - } - } - - result + })?; + } else { + trace!("No DNS settings to reset"); + }; + Ok(()) } fn revert_link( |
