From 144829b1d153eb32f914fa18e1cec8f98471958b Mon Sep 17 00:00:00 2001 From: Benedict Wong Date: Mon, 9 Mar 2020 18:01:30 -0700 Subject: [PATCH] Remove lock inversion in LegacyVpnRunner This commit prevents the lock inversion introduced in aosp/1218118 by reverting some of the calls to the cleanup code that ensures all outer class state is reset. At worst, the correctness of the outer class' state for the LegacyVpnRunner shutdown is the same as before aosp/1218118. This generally seems safe as: 1. This reverts it to a known state (non-ideal, but non-broken) 2. If the interfaces have already been created and registered with the event observer, the event observer will trigger a interfaceRemoved, which will both shutdown the LegacyVpnRunner, and cleanup the Vpn instance state. Bug: 151068107 Test: FrameworksNetTests passing Test: Repeated steps in bug, no deadlock Change-Id: I51a475f575252fb981641fc6240bb8c15576c5f2 --- .../core/java/com/android/server/connectivity/Vpn.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index e6c1aa4753215..30b2ab344ea16 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -2559,7 +2559,7 @@ public class Vpn { public void exitIfOuterInterfaceIs(String interfaze) { if (interfaze.equals(mOuterInterface)) { Log.i(TAG, "Legacy VPN is going down with " + interfaze); - exit(); + exitVpnRunner(); } } @@ -2568,6 +2568,10 @@ public class Vpn { public void exitVpnRunner() { // We assume that everything is reset after stopping the daemons. interrupt(); + + // Always disconnect. This may be called again in cleanupVpnStateLocked() if + // exitVpnRunner() was called from exit(), but it will be a no-op. + agentDisconnect(); try { mContext.unregisterReceiver(mBroadcastReceiver); } catch (IllegalArgumentException e) {} @@ -2790,7 +2794,7 @@ public class Vpn { } catch (Exception e) { Log.i(TAG, "Aborting", e); updateState(DetailedState.FAILED, e.getMessage()); - exit(); + exitVpnRunner(); } }