]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
TunnelManager: bound recursion in startActivation
authorJason A. Donenfeld <Jason@zx2c4.com>
Wed, 31 Oct 2018 14:58:03 +0000 (15:58 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Wed, 31 Oct 2018 14:58:03 +0000 (15:58 +0100)
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
WireGuard/WireGuard/VPN/TunnelsManager.swift

index 5a5c5d580af4cf89a4a58f18083566358e1a187c..2e28689f5ff0af8432c5ae8623f9aeccac03b7f7 100644 (file)
@@ -321,9 +321,17 @@ class TunnelContainer: NSObject {
         }
     }
 
-    fileprivate func startActivation(tunnelConfiguration: TunnelConfiguration,
+    fileprivate func startActivation(recursionCount: UInt = 0,
+                                     lastError: Error? = nil,
+                                     tunnelConfiguration: TunnelConfiguration,
                                      resolvedEndpoints: [Endpoint?],
                                      completionHandler: @escaping (Error?) -> Void) {
+        if (recursionCount >= 8) {
+            os_log("startActivation: Failed after 8 attempts. Giving up with %{public}@.", log: OSLog.default, type: .error, "\(lastError!)")
+            completionHandler(lastError)
+            return
+        }
+
         // resolvedEndpoints should contain only IP addresses, not any named endpoints
         assert(resolvedEndpoints.allSatisfy { (resolvedEndpoint) in
             guard let resolvedEndpoint = resolvedEndpoint else { return true }
@@ -349,7 +357,7 @@ class TunnelContainer: NSObject {
                 }
                 os_log("startActivation: Tunnel saved after re-enabling.", log: OSLog.default, type: .info)
                 os_log("startActivation: Invoking startActivation", log: OSLog.default, type: .debug)
-                self?.startActivation(tunnelConfiguration: tunnelConfiguration, resolvedEndpoints: resolvedEndpoints, completionHandler: completionHandler)
+                self?.startActivation(recursionCount: recursionCount + 1, lastError: NEVPNError(NEVPNError.configurationUnknown), tunnelConfiguration: tunnelConfiguration, resolvedEndpoints: resolvedEndpoints, completionHandler: completionHandler)
             }
             return
         }
@@ -392,7 +400,7 @@ class TunnelContainer: NSObject {
                 }
                 os_log("startActivation: Tunnel reloaded.", log: OSLog.default, type: .info)
                 os_log("startActivation: Invoking startActivation", log: OSLog.default, type: .debug)
-                self?.startActivation(tunnelConfiguration: tunnelConfiguration, resolvedEndpoints: resolvedEndpoints, completionHandler: completionHandler)
+                self?.startActivation(recursionCount: recursionCount + 1, lastError: vpnError, tunnelConfiguration: tunnelConfiguration, resolvedEndpoints: resolvedEndpoints, completionHandler: completionHandler)
             }
         }
     }