diff options
author | Eugene Susla <eugenesusla@google.com> | 2017-04-24 16:13:20 -0700 |
---|---|---|
committer | Eugene Susla <eugenesusla@google.com> | 2017-05-11 13:58:28 -0700 |
commit | 6fd0ce3616ce6b92bdb4443b189aa8ac9e106577 (patch) | |
tree | 872b347ca49a22c4ed1f12a171244a7178a8bb07 /services/companion | |
parent | 81a57133e8fd1b5d3bf018e2721f71f7197e94c6 (diff) |
Avoid activity leak via Companion callback
Test: invoke associate() API and ensure it still works
Change-Id: I9aedb043b4b1f0d77f076d8753cd60ff7c98a7d6
Diffstat (limited to 'services/companion')
-rw-r--r-- | services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 6093241a6681..73f1705e35df 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -110,10 +110,15 @@ public class CompanionDeviceManagerService extends SystemService implements Bind private final CompanionDeviceManagerImpl mImpl; private final ConcurrentMap<Integer, AtomicFile> mUidToStorage = new ConcurrentHashMap<>(); private IDeviceIdleController mIdleController; - private IFindDeviceCallback mFindDeviceCallback; private ServiceConnection mServiceConnection; private IAppOpsService mAppOpsManager; + private IFindDeviceCallback mFindDeviceCallback; + private AssociationRequest mRequest; + private String mCallingPackage; + + private final Object mLock = new Object(); + public CompanionDeviceManagerService(Context context) { super(context); mImpl = new CompanionDeviceManagerImpl(); @@ -156,8 +161,12 @@ public class CompanionDeviceManagerService extends SystemService implements Bind } private void cleanup() { - mServiceConnection = unbind(mServiceConnection); - mFindDeviceCallback = unlinkToDeath(mFindDeviceCallback, this, 0); + synchronized (mLock) { + mServiceConnection = unbind(mServiceConnection); + mFindDeviceCallback = unlinkToDeath(mFindDeviceCallback, this, 0); + mRequest = null; + mCallingPackage = null; + } } /** @@ -222,6 +231,17 @@ public class CompanionDeviceManagerService extends SystemService implements Bind } @Override + public void stopScan(AssociationRequest request, + IFindDeviceCallback callback, + String callingPackage) { + if (Objects.equals(request, mRequest) + && Objects.equals(callback, mFindDeviceCallback) + && Objects.equals(callingPackage, mCallingPackage)) { + cleanup(); + } + } + + @Override public List<String> getAssociations(String callingPackage, int userId) throws RemoteException { checkCallerIsSystemOr(callingPackage, userId); @@ -340,7 +360,11 @@ public class CompanionDeviceManagerService extends SystemService implements Bind "onServiceConnected(name = " + name + ", service = " + service + ")"); } + mFindDeviceCallback = findDeviceCallback; + mRequest = request; + mCallingPackage = callingPackage; + try { mFindDeviceCallback.asBinder().linkToDeath( CompanionDeviceManagerService.this, 0); @@ -348,6 +372,7 @@ public class CompanionDeviceManagerService extends SystemService implements Bind cleanup(); return; } + try { ICompanionDeviceDiscoveryService.Stub .asInterface(service) |