Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 877ec882 authored by Evan Severson's avatar Evan Severson
Browse files

Copy pointer to sOnOpNotedCallback before queuing dispatch

Test: Reproduce with attached test app
Fixes: 207324098
Change-Id: I9680c6f574d4355fcc5732c32e2287c5c1ccd4f2
parent ff3bb81a
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -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();
                    if (onOpNotedCallback != null) {
                        for (int i = 0; i < numMissedSyncOps; i++) {
                            final AsyncNotedAppOp syncNotedAppOp = sUnforwardedOps.get(i);
                        if (sOnOpNotedCallback != null) {
                            sOnOpNotedCallback.getAsyncNotedExecutor().execute(
                                    () -> sOnOpNotedCallback.onAsyncNoted(syncNotedAppOp));
                            onOpNotedCallback.getAsyncNotedExecutor().execute(
                                    () -> onOpNotedCallback.onAsyncNoted(syncNotedAppOp));
                        }
                    }
                    sUnforwardedOps.clear();