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

Commit 9e7c6b38 authored by Philip P. Moltmann's avatar Philip P. Moltmann Committed by Gerrit Code Review
Browse files

Merge "Synchronize mPermissions to void NullPointerException."

parents 4247a85c 267c50e7
Loading
Loading
Loading
Loading
+162 −111
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import com.android.internal.annotations.GuardedBy;

/**
 * This class encapsulates the permissions for a package or a shared user.
@@ -62,6 +63,9 @@ public final class PermissionsState {

    private static final int[] NO_GIDS = {};

    private final Object mLock = new Object();

    @GuardedBy("mLock")
    private ArrayMap<String, PermissionData> mPermissions;

    private int[] mGlobalGids = NO_GIDS;
@@ -96,6 +100,8 @@ public final class PermissionsState {
        if (other == this) {
            return;
        }

        synchronized (mLock) {
            if (mPermissions != null) {
                if (other.mPermissions == null) {
                    mPermissions = null;
@@ -114,6 +120,7 @@ public final class PermissionsState {
                    mPermissions.put(name, new PermissionData(permissionData));
                }
            }
        }

        mGlobalGids = NO_GIDS;
        if (other.mGlobalGids != NO_GIDS) {
@@ -153,6 +160,7 @@ public final class PermissionsState {
        }
        final PermissionsState other = (PermissionsState) obj;

        synchronized (mLock) {
            if (mPermissions == null) {
                if (other.mPermissions != null) {
                    return false;
@@ -160,6 +168,8 @@ public final class PermissionsState {
            } else if (!mPermissions.equals(other.mPermissions)) {
                return false;
            }
        }

        if (mPermissionReviewRequired == null) {
            if (other.mPermissionReviewRequired != null) {
                return false;
@@ -266,19 +276,23 @@ public final class PermissionsState {
    public boolean hasPermission(String name, int userId) {
        enforceValidUserId(userId);

        synchronized (mLock) {
            if (mPermissions == null) {
                return false;
            }

            PermissionData permissionData = mPermissions.get(name);

            return permissionData != null && permissionData.isGranted(userId);
        }

    }

    /**
     * Returns whether the state has any known request for the given permission name,
     * whether or not it has been granted.
     */
    public boolean hasRequestedPermission(ArraySet<String> names) {
        synchronized (mLock) {
            if (mPermissions == null) {
                return false;
            }
@@ -287,6 +301,8 @@ public final class PermissionsState {
                    return true;
                }
            }
        }

        return false;
    }

@@ -300,6 +316,7 @@ public final class PermissionsState {
    public Set<String> getPermissions(int userId) {
        enforceValidUserId(userId);

        synchronized (mLock) {
            if (mPermissions == null) {
                return Collections.emptySet();
            }
@@ -324,6 +341,7 @@ public final class PermissionsState {

            return permissions;
        }
    }

    /**
     * Gets the state for an install permission or null if no such.
@@ -399,14 +417,20 @@ public final class PermissionsState {

        final boolean mayChangeFlags = flagValues != 0 || flagMask != 0;

        synchronized (mLock) {
            if (mPermissions == null) {
                if (!mayChangeFlags) {
                    return false;
                }
                ensurePermissionData(permission);
            }
        }

        PermissionData permissionData = null;
        synchronized (mLock) {
            permissionData = mPermissions.get(permission.getName());
        }

        PermissionData permissionData = mPermissions.get(permission.getName());
        if (permissionData == null) {
            if (!mayChangeFlags) {
                return false;
@@ -439,6 +463,7 @@ public final class PermissionsState {
    }

    private boolean hasPermissionRequiringReview(int userId) {
        synchronized (mLock) {
            final int permissionCount = mPermissions.size();
            for (int i = 0; i < permissionCount; i++) {
                final PermissionData permission = mPermissions.valueAt(i);
@@ -447,6 +472,8 @@ public final class PermissionsState {
                    return true;
                }
            }
        }

        return false;
    }

@@ -454,6 +481,7 @@ public final class PermissionsState {
            int userId, int flagMask, int flagValues) {
        enforceValidUserId(userId);

        synchronized (mLock) {
            if (mPermissions == null) {
                return false;
            }
@@ -463,8 +491,10 @@ public final class PermissionsState {
                PermissionData permissionData = mPermissions.valueAt(i);
                changed |= permissionData.updateFlags(userId, flagMask, flagValues);
            }

            return changed;
        }
    }

    /**
     * Compute the Linux gids for a given device user from the permissions
@@ -479,6 +509,7 @@ public final class PermissionsState {

        int[] gids = mGlobalGids;

        synchronized (mLock) {
            if (mPermissions != null) {
                final int permissionCount = mPermissions.size();
                for (int i = 0; i < permissionCount; i++) {
@@ -493,6 +524,7 @@ public final class PermissionsState {
                    }
                }
            }
        }

        return gids;
    }
@@ -519,11 +551,16 @@ public final class PermissionsState {
     */
    public void reset() {
        mGlobalGids = NO_GIDS;

        synchronized (mLock) {
            mPermissions = null;
        }

        mPermissionReviewRequired = null;
    }

    private PermissionState getPermissionState(String name, int userId) {
        synchronized (mLock) {
            if (mPermissions == null) {
                return null;
            }
@@ -531,12 +568,15 @@ public final class PermissionsState {
            if (permissionData == null) {
                return null;
            }

            return permissionData.getPermissionState(userId);
        }
    }

    private List<PermissionState> getPermissionStatesInternal(int userId) {
        enforceValidUserId(userId);

        synchronized (mLock) {
            if (mPermissions == null) {
                return Collections.emptyList();
            }
@@ -555,6 +595,7 @@ public final class PermissionsState {

            return permissionStates;
        }
    }

    private int grantPermission(BasePermission permission, int userId) {
        if (hasPermission(permission.getName(), userId)) {
@@ -589,7 +630,10 @@ public final class PermissionsState {
        final boolean hasGids = !ArrayUtils.isEmpty(permission.computeGids(userId));
        final int[] oldGids = hasGids ? computeGids(userId) : NO_GIDS;

        PermissionData permissionData = mPermissions.get(permName);
        PermissionData permissionData = null;
        synchronized (mLock) {
            permissionData = mPermissions.get(permName);
        }

        if (!permissionData.revoke(userId)) {
            return PERMISSION_OPERATION_FAILURE;
@@ -627,6 +671,8 @@ public final class PermissionsState {

    private PermissionData ensurePermissionData(BasePermission permission) {
        final String permName = permission.getName();

        synchronized (mLock) {
            if (mPermissions == null) {
                mPermissions = new ArrayMap<>();
            }
@@ -638,7 +684,10 @@ public final class PermissionsState {
            return permissionData;
        }

    }

    private void ensureNoPermissionData(String name) {
        synchronized (mLock) {
            if (mPermissions == null) {
                return;
            }
@@ -648,6 +697,8 @@ public final class PermissionsState {
            }
        }

    }

    private static final class PermissionData {
        private final BasePermission mPerm;
        private SparseArray<PermissionState> mUserStates = new SparseArray<>();