diff options
| author | 2021-06-10 15:16:34 +0000 | |
|---|---|---|
| committer | 2021-06-10 15:16:34 +0000 | |
| commit | 1142e5e8cb139d4b9bea3431e98bcaf6445849d6 (patch) | |
| tree | 53c1597c3aa086fc67494085921384cd81351ad9 | |
| parent | 271c600617c66e97afca9354843b54b1b02a4865 (diff) | |
| parent | a3c06bc6bb2fd72c282bea8f622df02a356c7820 (diff) | |
Merge "Don't leak AccessibilityManager binder proxy." into sc-dev
2 files changed, 35 insertions, 24 deletions
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 9a3573874471..9ff534046d11 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -10005,14 +10005,23 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return true; } - private AccessibilityManager getAccessibilityManagerForUser(int userId) { + /** + * Invoke a method in AccessibilityManager ensuring the client is removed. + */ + private <T> T withAccessibilityManager( + int userId, Function<AccessibilityManager, T> function) { // Not using AccessibilityManager.getInstance because that guesses // at the user you require based on callingUid and caches for a given // process. - IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE); - IAccessibilityManager service = iBinder == null + final IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE); + final IAccessibilityManager service = iBinder == null ? null : IAccessibilityManager.Stub.asInterface(iBinder); - return new AccessibilityManager(mContext, service, userId); + final AccessibilityManager am = new AccessibilityManager(mContext, service, userId); + try { + return function.apply(am); + } finally { + am.removeClient(); + } } @Override @@ -10025,22 +10034,21 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (packageList != null) { int userId = caller.getUserId(); - List<AccessibilityServiceInfo> enabledServices = null; + final List<AccessibilityServiceInfo> enabledServices; long id = mInjector.binderClearCallingIdentity(); try { UserInfo user = getUserInfo(userId); if (user.isManagedProfile()) { userId = user.profileGroupId; } - AccessibilityManager accessibilityManager = getAccessibilityManagerForUser(userId); - enabledServices = accessibilityManager.getEnabledAccessibilityServiceList( - FEEDBACK_ALL_MASK); + enabledServices = withAccessibilityManager(userId, + am -> am.getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK)); } finally { mInjector.binderRestoreCallingIdentity(id); } if (enabledServices != null) { - List<String> enabledPackages = new ArrayList<String>(); + List<String> enabledPackages = new ArrayList<>(); for (AccessibilityServiceInfo service : enabledServices) { enabledPackages.add(service.getResolveInfo().serviceInfo.packageName); } @@ -10122,10 +10130,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (user.isManagedProfile()) { userId = user.profileGroupId; } - AccessibilityManager accessibilityManager = - getAccessibilityManagerForUser(userId); - List<AccessibilityServiceInfo> installedServices = - accessibilityManager.getInstalledAccessibilityServiceList(); + final List<AccessibilityServiceInfo> installedServices = + withAccessibilityManager(userId, + AccessibilityManager::getInstalledAccessibilityServiceList); if (installedServices != null) { for (AccessibilityServiceInfo service : installedServices) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PersonalAppsSuspensionHelper.java b/services/devicepolicy/java/com/android/server/devicepolicy/PersonalAppsSuspensionHelper.java index 48d2d73543fb..532823ad8367 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PersonalAppsSuspensionHelper.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PersonalAppsSuspensionHelper.java @@ -18,8 +18,6 @@ package com.android.server.devicepolicy; import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK; -import static com.android.server.devicepolicy.DevicePolicyManagerService.LOG_TAG; - import android.accessibilityservice.AccessibilityServiceInfo; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -142,9 +140,21 @@ public final class PersonalAppsSuspensionHelper { } private List<String> getAccessibilityServices() { - final List<AccessibilityServiceInfo> accessibilityServiceInfos = - getAccessibilityManagerForUser(mContext.getUserId()) - .getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK); + final List<AccessibilityServiceInfo> accessibilityServiceInfos; + // Not using AccessibilityManager.getInstance because that guesses + // at the user you require based on callingUid and caches for a given + // process. + final IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE); + final IAccessibilityManager service = iBinder == null + ? null : IAccessibilityManager.Stub.asInterface(iBinder); + final AccessibilityManager am = + new AccessibilityManager(mContext, service, mContext.getUserId()); + try { + accessibilityServiceInfos = am.getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK); + } finally { + am.removeClient(); + } + final List<String> result = new ArrayList<>(); for (final AccessibilityServiceInfo serviceInfo : accessibilityServiceInfos) { final ComponentName componentName = @@ -192,12 +202,6 @@ public final class PersonalAppsSuspensionHelper { return resolveInfos != null && !resolveInfos.isEmpty(); } - private AccessibilityManager getAccessibilityManagerForUser(int userId) { - final IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE); - final IAccessibilityManager service = - iBinder == null ? null : IAccessibilityManager.Stub.asInterface(iBinder); - return new AccessibilityManager(mContext, service, userId); - } void dump(IndentingPrintWriter pw) { pw.println("PersonalAppsSuspensionHelper"); |