summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-04-03 15:06:42 +0200
committerDavid Lönnhager <david.l@mullvad.net>2020-06-02 10:05:02 +0200
commitd8ec54b0185f8592ee6d8e6aca9f5e427092414d (patch)
tree1a5314caa33bdffd40366fd74346aa3f6d5cafd5
parent15580b15cc53c379b5de3d01817935a06db6f1ac (diff)
downloadmullvadvpn-d8ec54b0185f8592ee6d8e6aca9f5e427092414d.tar.xz
mullvadvpn-d8ec54b0185f8592ee6d8e6aca9f5e427092414d.zip
Fix assumptions about rt_tables file
-rw-r--r--talpid-core/src/split.rs25
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