summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls Piņķis <emils@mullvad.net>2018-10-08 17:29:18 +0100
committerEmīls Piņķis <emils@mullvad.net>2018-10-09 13:49:40 +0100
commitedcc59760a5ecedee6fe2bb560ccfb157539396b (patch)
tree85d65c1e9ff11afa811089ab58a0de66df36034e
parentc231604e1b4fa1bb9e7e7a1a3b254892e22ddcfc (diff)
downloadmullvadvpn-edcc59760a5ecedee6fe2bb560ccfb157539396b.tar.xz
mullvadvpn-edcc59760a5ecedee6fe2bb560ccfb157539396b.zip
Fix resolved by always resolving interface names to real IDs.
-rw-r--r--CHANGELOG.md4
-rw-r--r--talpid-core/src/security/linux/dns/systemd_resolved.rs50
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(