]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Fixed a potential race condition, better naming on PacketTunnelSettingsGenerator...
authorEric Kuck <eric@bluelinelabs.com>
Tue, 11 Dec 2018 22:59:15 +0000 (16:59 -0600)
committerEric Kuck <eric@bluelinelabs.com>
Tue, 11 Dec 2018 22:59:15 +0000 (16:59 -0600)
Signed-off-by: Eric Kuck <eric@bluelinelabs.com>
WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift
WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift

index 1a51573ad6bf80a73d36a116e4bb8fe99561793f..04e96379dc4c67e99c32b66618e9ad759851eb75 100644 (file)
@@ -88,8 +88,28 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
             return
         }
 
-        let wireguardSettings = packetTunnelSettingsGenerator.generateWireGuardSettings()
-        let handle = connect(interfaceName: tunnelConfiguration.interface.name, settings: wireguardSettings, fd: fd)
+        let wireguardSettings = packetTunnelSettingsGenerator.uapiConfiguration()
+        
+        var handle: Int32 = -1
+        
+        networkMonitor = NWPathMonitor()
+        networkMonitor?.pathUpdateHandler = { path in
+            guard handle >= 0 else { return }
+            
+            if path.status == .satisfied {
+                let endpointString = packetTunnelSettingsGenerator.endpointUapiConfiguration()
+                
+                let endpointGoString = endpointString.withCString {
+                    gostring_t(p: $0, n: endpointString.utf8.count)
+                }
+                
+                wg_log(.debug, staticMessage: "Network change detected, calling wgSetConfig")
+                wgSetConfig(handle, endpointGoString)
+            }
+        }
+        networkMonitor?.start(queue: DispatchQueue(label: "NetworkMonitor"))
+        
+        handle = connect(interfaceName: tunnelConfiguration.interface.name, settings: wireguardSettings, fd: fd)
 
         if handle < 0 {
             wg_log(.error, staticMessage: "Starting tunnel failed: Could not start WireGuard")
@@ -113,20 +133,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
                 startTunnelCompletionHandler(nil /* No errors */)
             }
         }
-        
-        networkMonitor = NWPathMonitor()
-        networkMonitor?.pathUpdateHandler = { path in
-            if path.status == .satisfied {
-                let endpointString = packetTunnelSettingsGenerator.endpointFromSettings()
-                
-                let endpointGoString = endpointString.withCString {
-                    gostring_t(p: $0, n: endpointString.utf8.count)
-                }
-                
-                wgSetConfig(handle, endpointGoString)
-            }
-        }
-        networkMonitor?.start(queue: DispatchQueue(label: "NetworkMonitor"))
     }
 
     /// Begin the process of stopping the tunnel.
index 906aea911af7bbd078da02cfc574c055ab4beec9..0eea95aacfe8762178d1e5f8ee8309ab84cb2c91 100644 (file)
@@ -15,7 +15,7 @@ class PacketTunnelSettingsGenerator {
         self.resolvedEndpoints = resolvedEndpoints
     }
 
-    func endpointFromSettings() -> String {
+    func endpointUapiConfiguration() -> String {
         var wgSettings = "listen_port=\(tunnelConfiguration.interface.listenPort ?? 0)\n"
 
         for (i, peer) in tunnelConfiguration.peers.enumerated() {
@@ -29,7 +29,7 @@ class PacketTunnelSettingsGenerator {
         return wgSettings
     }
     
-    func generateWireGuardSettings() -> String {
+    func uapiConfiguration() -> String {
         var wgSettings = ""
         let privateKey = tunnelConfiguration.interface.privateKey.hexEncodedString()
         wgSettings.append("private_key=\(privateKey)\n")