Fix race condition when collecting op callback.
Other threads may change mOpModeWatchers, mPackageModeWatchers by startWatchingMode, stopWatchingMode. Change-Id: Id260172979ddfc2df9331880805d16ee13e183eb
This commit is contained in:
@@ -513,33 +513,35 @@ public class AppOpsService extends IAppOpsService.Stub {
|
||||
String[] uidPackageNames = getPackagesForUid(uid);
|
||||
ArrayMap<Callback, ArraySet<String>> callbackSpecs = null;
|
||||
|
||||
ArrayList<Callback> callbacks = mOpModeWatchers.get(code);
|
||||
if (callbacks != null) {
|
||||
final int callbackCount = callbacks.size();
|
||||
for (int i = 0; i < callbackCount; i++) {
|
||||
Callback callback = callbacks.get(i);
|
||||
ArraySet<String> changedPackages = new ArraySet<>();
|
||||
Collections.addAll(changedPackages, uidPackageNames);
|
||||
callbackSpecs = new ArrayMap<>();
|
||||
callbackSpecs.put(callback, changedPackages);
|
||||
}
|
||||
}
|
||||
|
||||
for (String uidPackageName : uidPackageNames) {
|
||||
callbacks = mPackageModeWatchers.get(uidPackageName);
|
||||
synchronized (this) {
|
||||
ArrayList<Callback> callbacks = mOpModeWatchers.get(code);
|
||||
if (callbacks != null) {
|
||||
if (callbackSpecs == null) {
|
||||
callbackSpecs = new ArrayMap<>();
|
||||
}
|
||||
final int callbackCount = callbacks.size();
|
||||
for (int i = 0; i < callbackCount; i++) {
|
||||
Callback callback = callbacks.get(i);
|
||||
ArraySet<String> changedPackages = callbackSpecs.get(callback);
|
||||
if (changedPackages == null) {
|
||||
changedPackages = new ArraySet<>();
|
||||
callbackSpecs.put(callback, changedPackages);
|
||||
ArraySet<String> changedPackages = new ArraySet<>();
|
||||
Collections.addAll(changedPackages, uidPackageNames);
|
||||
callbackSpecs = new ArrayMap<>();
|
||||
callbackSpecs.put(callback, changedPackages);
|
||||
}
|
||||
}
|
||||
|
||||
for (String uidPackageName : uidPackageNames) {
|
||||
callbacks = mPackageModeWatchers.get(uidPackageName);
|
||||
if (callbacks != null) {
|
||||
if (callbackSpecs == null) {
|
||||
callbackSpecs = new ArrayMap<>();
|
||||
}
|
||||
final int callbackCount = callbacks.size();
|
||||
for (int i = 0; i < callbackCount; i++) {
|
||||
Callback callback = callbacks.get(i);
|
||||
ArraySet<String> changedPackages = callbackSpecs.get(callback);
|
||||
if (changedPackages == null) {
|
||||
changedPackages = new ArraySet<>();
|
||||
callbackSpecs.put(callback, changedPackages);
|
||||
}
|
||||
changedPackages.add(uidPackageName);
|
||||
}
|
||||
changedPackages.add(uidPackageName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1773,7 +1775,7 @@ public class AppOpsService extends IAppOpsService.Stub {
|
||||
private static String[] getPackagesForUid(int uid) {
|
||||
String[] packageNames = null;
|
||||
try {
|
||||
packageNames= AppGlobals.getPackageManager().getPackagesForUid(uid);
|
||||
packageNames = AppGlobals.getPackageManager().getPackagesForUid(uid);
|
||||
} catch (RemoteException e) {
|
||||
/* ignore - local call */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user