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

Commit af61c4f3 authored by Pinyao Ting's avatar Pinyao Ting
Browse files

Fix a ConcurrentModificationException in SlicePermissionManager

Bug: 372865982
Change-Id: Ib70247e755d849853e098636e6f61bcd8c627ef7
Test: manual
Flag: EXEMPT bugfix
parent 36eb5936
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -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,15 +358,23 @@ public class SlicePermissionManager implements DirtyTracker {
    // use addPersistableDirty(); this is just for tests
    @VisibleForTesting
    void addDirtyImmediate(Persistable obj) {
        synchronized (this) {
            mDirty.add(obj);
        }
    }

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

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