diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-04-03 15:06:42 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-06-02 10:05:02 +0200 |
| commit | d8ec54b0185f8592ee6d8e6aca9f5e427092414d (patch) | |
| tree | 1a5314caa33bdffd40366fd74346aa3f6d5cafd5 | |
| parent | 15580b15cc53c379b5de3d01817935a06db6f1ac (diff) | |
| download | mullvadvpn-d8ec54b0185f8592ee6d8e6aca9f5e427092414d.tar.xz mullvadvpn-d8ec54b0185f8592ee6d8e6aca9f5e427092414d.zip | |
Fix assumptions about rt_tables file
| -rw-r--r-- | talpid-core/src/split.rs | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/talpid-core/src/split.rs b/talpid-core/src/split.rs index dc19b1e861..7ae0f365c5 100644 --- a/talpid-core/src/split.rs +++ b/talpid-core/src/split.rs @@ -2,7 +2,7 @@ use regex::Regex; use std::{ fs, - io::{self, BufRead, BufReader, BufWriter, Write}, + io::{self, BufRead, BufReader, BufWriter, Read, Seek, Write}, net::{AddrParseError, IpAddr}, path::Path, process::Command, @@ -128,13 +128,11 @@ impl SplitTunnel { fn initialize_routing_table(&mut self) -> Result<(), Error> { // Add routing table to /etc/iproute2/rt_tables, if it does not exist - let mut file = fs::OpenOptions::new() + let file = fs::OpenOptions::new() .read(true) - .append(true) - .create(true) .open(RT_TABLES_PATH) .map_err(Error::RoutingTableSetup)?; - let buf_reader = BufReader::new(file.try_clone().map_err(Error::RoutingTableSetup)?); + let buf_reader = BufReader::new(file); let expression = Regex::new(r"^\s*(\d+)\s+(\w+)").unwrap(); let mut used_ids = Vec::<i32>::new(); @@ -169,7 +167,22 @@ impl SplitTunnel { } } - write!(file, "{} {}", self.table_id, ROUTING_TABLE_NAME).map_err(Error::RoutingTableSetup) + let mut file = fs::OpenOptions::new() + .read(true) + .append(true) + .open(RT_TABLES_PATH) + .map_err(Error::RoutingTableSetup)?; + + if let Ok(_) = file.seek(io::SeekFrom::End(-1)) { + // Append newline if necessary + let mut buffer = [0u8]; + let _ = file.read_exact(&mut buffer); + if buffer[0] != b'\n' { + writeln!(file).map_err(Error::RoutingTableSetup)?; + } + } + + writeln!(file, "{} {}", self.table_id, ROUTING_TABLE_NAME).map_err(Error::RoutingTableSetup) } /// Reset the split-tunneling routing table to its default state |
