diff options
| -rw-r--r-- | services/core/java/com/android/server/slice/SlicePermissionManager.java | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/slice/SlicePermissionManager.java b/services/core/java/com/android/server/slice/SlicePermissionManager.java index 343d2e353abb..d118eaea37d9 100644 --- a/services/core/java/com/android/server/slice/SlicePermissionManager.java +++ b/services/core/java/com/android/server/slice/SlicePermissionManager.java @@ -29,6 +29,7 @@ import android.util.Log; import android.util.Slog; import android.util.Xml.Encoding; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.XmlUtils; import com.android.server.slice.SliceProviderPermissions.SliceAuthority; @@ -76,8 +77,11 @@ public class SlicePermissionManager implements DirtyTracker { private final File mSliceDir; private final Context mContext; private final Handler mHandler; + @GuardedBy("itself") private final ArrayMap<PkgUser, SliceProviderPermissions> mCachedProviders = new ArrayMap<>(); + @GuardedBy("itself") private final ArrayMap<PkgUser, SliceClientPermissions> mCachedClients = new ArrayMap<>(); + @GuardedBy("this") private final ArraySet<Persistable> mDirty = new ArraySet<>(); @VisibleForTesting @@ -354,14 +358,22 @@ public class SlicePermissionManager implements DirtyTracker { // use addPersistableDirty(); this is just for tests @VisibleForTesting void addDirtyImmediate(Persistable obj) { - mDirty.add(obj); + synchronized (this) { + mDirty.add(obj); + } } private void handleRemove(PkgUser pkgUser) { getFile(SliceClientPermissions.getFileName(pkgUser)).delete(); getFile(SliceProviderPermissions.getFileName(pkgUser)).delete(); - mDirty.remove(mCachedClients.remove(pkgUser)); - mDirty.remove(mCachedProviders.remove(pkgUser)); + synchronized (this) { + synchronized (mCachedClients) { + mDirty.remove(mCachedClients.remove(pkgUser)); + } + synchronized (mCachedProviders) { + mDirty.remove(mCachedProviders.remove(pkgUser)); + } + } } private final class H extends Handler { @@ -379,7 +391,9 @@ public class SlicePermissionManager implements DirtyTracker { public void handleMessage(Message msg) { switch (msg.what) { case MSG_ADD_DIRTY: - mDirty.add((Persistable) msg.obj); + synchronized (SlicePermissionManager.this) { + mDirty.add((Persistable) msg.obj); + } break; case MSG_PERSIST: handlePersist(); |