From 877ec8829845e931a878f60652a1ee672f0a5ccf Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Mon, 22 Nov 2021 07:36:07 -0800 Subject: Copy pointer to sOnOpNotedCallback before queuing dispatch Test: Reproduce with attached test app Fixes: 207324098 Change-Id: I9680c6f574d4355fcc5732c32e2287c5c1ccd4f2 --- core/java/android/app/AppOpsManager.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 7a545f695aff..565f69090c6b 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -9469,23 +9469,23 @@ public class AppOpsManager { e.rethrowFromSystemServer(); } - if (missedAsyncOps != null) { + // Copy pointer so callback can be dispatched out of lock + OnOpNotedCallback onOpNotedCallback = sOnOpNotedCallback; + if (onOpNotedCallback != null && missedAsyncOps != null) { int numMissedAsyncOps = missedAsyncOps.size(); for (int i = 0; i < numMissedAsyncOps; i++) { final AsyncNotedAppOp asyncNotedAppOp = missedAsyncOps.get(i); - if (sOnOpNotedCallback != null) { - sOnOpNotedCallback.getAsyncNotedExecutor().execute( - () -> sOnOpNotedCallback.onAsyncNoted(asyncNotedAppOp)); - } + onOpNotedCallback.getAsyncNotedExecutor().execute( + () -> onOpNotedCallback.onAsyncNoted(asyncNotedAppOp)); } } synchronized (this) { int numMissedSyncOps = sUnforwardedOps.size(); - for (int i = 0; i < numMissedSyncOps; i++) { - final AsyncNotedAppOp syncNotedAppOp = sUnforwardedOps.get(i); - if (sOnOpNotedCallback != null) { - sOnOpNotedCallback.getAsyncNotedExecutor().execute( - () -> sOnOpNotedCallback.onAsyncNoted(syncNotedAppOp)); + if (onOpNotedCallback != null) { + for (int i = 0; i < numMissedSyncOps; i++) { + final AsyncNotedAppOp syncNotedAppOp = sUnforwardedOps.get(i); + onOpNotedCallback.getAsyncNotedExecutor().execute( + () -> onOpNotedCallback.onAsyncNoted(syncNotedAppOp)); } } sUnforwardedOps.clear(); -- cgit v1.2.3-59-g8ed1b