From 520cc2fde363dd038911b98b8b46259faf58a659 Mon Sep 17 00:00:00 2001 From: lucaslin Date: Wed, 30 Mar 2022 20:42:43 +0800 Subject: [PATCH] Clear mInterface before calling resetIkeState() Clear mInterface before calling resetIkeState() in onDefaultNetworkChanged(). resetIkeState() will trigger interfaceRemoved() to be called. If mInterface is set, interfaceRemoved() will clear Ikev2VpnRunner which makes VPN disconnect. This issue can be reproduced when device establishes VPN connection with mobile data first then connects to wifi. In this case, onLost() for mobile data will not be called because there is a new network(wifi) can satisfy the request, so only onAvailable() for wifi will be called. Which means onSessionLost() will not be called and only onDefaultNetworkChanged() will be called, which makes that mInterface is not cleared before interfaceRemoved() is called. Bug: 219546241 Test: Check if VPN is still there when establishing VPN with mobile data first, then connect to wifi and disconnect wifi. Change-Id: I7f9a1d9afd2a40762e9fac68edf1fb8ae75df8bc --- services/core/java/com/android/server/connectivity/Vpn.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index a6da4a6a4260..35217dba7c28 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -2692,6 +2692,9 @@ public class Vpn { return; // VPN has been shut down. } + // Clear mInterface to prevent Ikev2VpnRunner being cleared when + // interfaceRemoved() is called. + mInterface = null; // Without MOBIKE, we have no way to seamlessly migrate. Close on old // (non-default) network, and start the new one. resetIkeState();