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

Commit 353cfbb2 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix a ConcurrentModificationException in SlicePermissionManager" into main

parents 1873f2ec af61c4f3
Loading
Loading
Loading
Loading
+18 −4
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ import android.util.Log;
import android.util.Slog;
import android.util.Slog;
import android.util.Xml.Encoding;
import android.util.Xml.Encoding;


import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.XmlUtils;
import com.android.internal.util.XmlUtils;
import com.android.server.slice.SliceProviderPermissions.SliceAuthority;
import com.android.server.slice.SliceProviderPermissions.SliceAuthority;
@@ -76,8 +77,11 @@ public class SlicePermissionManager implements DirtyTracker {
    private final File mSliceDir;
    private final File mSliceDir;
    private final Context mContext;
    private final Context mContext;
    private final Handler mHandler;
    private final Handler mHandler;
    @GuardedBy("itself")
    private final ArrayMap<PkgUser, SliceProviderPermissions> mCachedProviders = new ArrayMap<>();
    private final ArrayMap<PkgUser, SliceProviderPermissions> mCachedProviders = new ArrayMap<>();
    @GuardedBy("itself")
    private final ArrayMap<PkgUser, SliceClientPermissions> mCachedClients = new ArrayMap<>();
    private final ArrayMap<PkgUser, SliceClientPermissions> mCachedClients = new ArrayMap<>();
    @GuardedBy("this")
    private final ArraySet<Persistable> mDirty = new ArraySet<>();
    private final ArraySet<Persistable> mDirty = new ArraySet<>();


    @VisibleForTesting
    @VisibleForTesting
@@ -354,15 +358,23 @@ public class SlicePermissionManager implements DirtyTracker {
    // use addPersistableDirty(); this is just for tests
    // use addPersistableDirty(); this is just for tests
    @VisibleForTesting
    @VisibleForTesting
    void addDirtyImmediate(Persistable obj) {
    void addDirtyImmediate(Persistable obj) {
        synchronized (this) {
            mDirty.add(obj);
            mDirty.add(obj);
        }
        }
    }


    private void handleRemove(PkgUser pkgUser) {
    private void handleRemove(PkgUser pkgUser) {
        getFile(SliceClientPermissions.getFileName(pkgUser)).delete();
        getFile(SliceClientPermissions.getFileName(pkgUser)).delete();
        getFile(SliceProviderPermissions.getFileName(pkgUser)).delete();
        getFile(SliceProviderPermissions.getFileName(pkgUser)).delete();
        synchronized (this) {
            synchronized (mCachedClients) {
                mDirty.remove(mCachedClients.remove(pkgUser));
                mDirty.remove(mCachedClients.remove(pkgUser));
            }
            synchronized (mCachedProviders) {
                mDirty.remove(mCachedProviders.remove(pkgUser));
                mDirty.remove(mCachedProviders.remove(pkgUser));
            }
            }
        }
    }


    private final class H extends Handler {
    private final class H extends Handler {
        private static final int MSG_ADD_DIRTY = 1;
        private static final int MSG_ADD_DIRTY = 1;
@@ -379,7 +391,9 @@ public class SlicePermissionManager implements DirtyTracker {
        public void handleMessage(Message msg) {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            switch (msg.what) {
                case MSG_ADD_DIRTY:
                case MSG_ADD_DIRTY:
                    synchronized (SlicePermissionManager.this) {
                        mDirty.add((Persistable) msg.obj);
                        mDirty.add((Persistable) msg.obj);
                    }
                    break;
                    break;
                case MSG_PERSIST:
                case MSG_PERSIST:
                    handlePersist();
                    handlePersist();