From 4d3e05ac6be0b99f6ce96606f799cd8e0b36fd2b Mon Sep 17 00:00:00 2001 From: Mygod Date: Fri, 12 Jun 2020 01:16:57 -0400 Subject: [PATCH] Add stopped check in Routing --- .../src/main/java/be/mygod/vpnhotspot/RepeaterService.kt | 2 +- mobile/src/main/java/be/mygod/vpnhotspot/net/Routing.kt | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/RepeaterService.kt b/mobile/src/main/java/be/mygod/vpnhotspot/RepeaterService.kt index 6f0e7c85..8223e573 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/RepeaterService.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/RepeaterService.kt @@ -379,7 +379,7 @@ class RepeaterService : Service(), CoroutineScope, WifiP2pManager.ChannelListene persistNextGroup = false } check(routingManager == null) - routingManager = object : RoutingManager.LocalOnly(this, group.`interface`!!) { + routingManager = object : RoutingManager.LocalOnly(this@RepeaterService, group.`interface`!!) { override fun ifaceHandler(iface: NetworkInterface) { iface.hardwareAddress?.asIterable()?.macToString()?.let { lastMac = it } } diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/net/Routing.kt b/mobile/src/main/java/be/mygod/vpnhotspot/net/Routing.kt index 62fb7ba6..0964e84e 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/Routing.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/Routing.kt @@ -129,6 +129,8 @@ class Routing(private val caller: Any, private val downstream: String, private val hostSubnet = "${hostAddress.address.hostAddress}/${hostAddress.networkPrefixLength}" private val transaction = RootSession.beginTransaction() + @Volatile + private var stopped = false private var masqueradeMode = MasqueradeMode.None private val upstreams = HashSet() @@ -164,6 +166,7 @@ class Routing(private val caller: Any, private val downstream: String, var dns: List = emptyList() override fun onAvailable(ifname: String, properties: LinkProperties) = synchronized(this@Routing) { + if (stopped) return val subrouting = subrouting when { subrouting != null -> check(subrouting.upstream == ifname) { "${subrouting.upstream} != $ifname" } @@ -181,6 +184,7 @@ class Routing(private val caller: Any, private val downstream: String, } override fun onLost() = synchronized(this@Routing) { + if (stopped) return val subrouting = subrouting ?: return // we could be removing fallback subrouting which no collision could ever happen, check before removing subrouting.upstream?.let { check(upstreams.remove(it)) } @@ -193,6 +197,7 @@ class Routing(private val caller: Any, private val downstream: String, private val fallbackUpstream = object : Upstream(RULE_PRIORITY_UPSTREAM_FALLBACK) { var fallbackInactive = true override fun onFallback() = synchronized(this@Routing) { + if (stopped) return fallbackInactive = false check(subrouting == null) subrouting = try { @@ -231,6 +236,7 @@ class Routing(private val caller: Any, private val downstream: String, } private val clients = mutableMapOf() override fun onIpNeighbourAvailable(neighbours: Collection) = synchronized(this) { + if (stopped) return val toRemove = HashSet(clients.keys) for (neighbour in neighbours) { if (neighbour.dev != downstream || neighbour.ip !is Inet4Address || @@ -328,6 +334,7 @@ class Routing(private val caller: Any, private val downstream: String, } fun stop() { + stopped = true IpNeighbourMonitor.unregisterCallback(this) FallbackUpstreamMonitor.unregisterCallback(fallbackUpstream) UpstreamMonitor.unregisterCallback(upstream)