Don't leak AccessibilityManager binder proxy.

Bug: 190412311
Test: atest MixedDeviceOwnerTest#testPermittedAccessibilityServices
Test: com.android.cts.devicepolicy.OrgOwnedProfileOwnerTest#testPersonalAppsSuspensionNormalApp
Change-Id: I34b0ff5cbf52786e0f0c10f787e2ceddfca1e4e1
This commit is contained in:
Pavel Grafov
2021-06-09 16:31:11 +01:00
parent d8be4517b3
commit a3c06bc6bb
2 changed files with 35 additions and 24 deletions

View File

@@ -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) {

View File

@@ -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");