summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Pavel Grafov <pgrafov@google.com> 2021-06-10 15:16:34 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-06-10 15:16:34 +0000
commit1142e5e8cb139d4b9bea3431e98bcaf6445849d6 (patch)
tree53c1597c3aa086fc67494085921384cd81351ad9
parent271c600617c66e97afca9354843b54b1b02a4865 (diff)
parenta3c06bc6bb2fd72c282bea8f622df02a356c7820 (diff)
Merge "Don't leak AccessibilityManager binder proxy." into sc-dev
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java33
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/PersonalAppsSuspensionHelper.java26
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");