From aad5f733cd9cf7729f462ace070748a9d66cd8b4 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Mon, 30 Nov 2020 09:43:47 -0800 Subject: [PATCH] Fix ConcurrentModification in onUidStateChanged Bug: 172776374 Fixes: 173078211 Test: Presubmit Change-Id: Ib4c96e81cbe2adcfd53ea23ae644e978effb7a92 --- .../com/android/server/appop/AppOpsService.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index da4704097ad01..0fadc0b6885ef 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -1057,19 +1057,20 @@ public class AppOpsService extends IAppOpsService.Stub { } int numInProgressEvents = mInProgressEvents.size(); + List binders = new ArrayList<>(mInProgressEvents.keySet()); for (int i = 0; i < numInProgressEvents; i++) { - InProgressStartOpEvent event = mInProgressEvents.valueAt(i); + InProgressStartOpEvent event = mInProgressEvents.get(binders.get(i)); - if (event.getUidState() != newState) { + if (event != null && event.getUidState() != newState) { try { // Remove all but one unfinished start count and then call finished() to // remove start event object int numPreviousUnfinishedStarts = event.numUnfinishedStarts; event.numUnfinishedStarts = 1; - finished(event.getClientId(), false); - OpEventProxyInfo proxy = event.getProxy(); + finished(event.getClientId(), false); + // Call started() to add a new start event object and then add the // previously removed unfinished start counts back if (proxy != null) { @@ -1079,7 +1080,11 @@ public class AppOpsService extends IAppOpsService.Stub { started(event.getClientId(), Process.INVALID_UID, null, null, newState, OP_FLAG_SELF, false); } - event.numUnfinishedStarts += numPreviousUnfinishedStarts - 1; + + InProgressStartOpEvent newEvent = mInProgressEvents.get(binders.get(i)); + if (newEvent != null) { + newEvent.numUnfinishedStarts += numPreviousUnfinishedStarts - 1; + } } catch (RemoteException e) { if (DEBUG) Slog.e(TAG, "Cannot switch to new uidState " + newState); }