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

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

Merge "Fix deadlock in AccessCheckDelegateImpl." into main

parents dfdc501f 92586c12
Loading
Loading
Loading
Loading
+16 −9
Original line number Diff line number Diff line
@@ -308,17 +308,23 @@ public interface AccessCheckDelegate extends CheckPermissionDelegate, CheckOpsDe
                @NonNull String persistentDeviceId, @UserIdInt int userId,
                @NonNull QuadFunction<String, String, String, Integer, Integer> superImpl) {
            boolean useShellDelegate;
            boolean hasOverridePermissionStates;

            synchronized (mLock) {
                useShellDelegate = !SHELL_PKG.equals(packageName)
                        && TextUtils.equals(mDelegatePackage, packageName)
                        && isDelegatePermission(permissionName);
                hasOverridePermissionStates = mOverridePermissionStates != null;
            }

                if (!useShellDelegate && mOverridePermissionStates != null) {
            if (!useShellDelegate && hasOverridePermissionStates) {
                int uid = LocalServices.getService(PackageManagerInternal.class)
                        .getPackageUid(packageName, 0, userId);
                if (uid >= 0) {
                        Map<String, Integer> permissionGrants = mOverridePermissionStates.get(uid);
                    synchronized (mLock) {
                        if (mOverridePermissionStates != null) {
                            Map<String, Integer> permissionGrants =
                                    mOverridePermissionStates.get(uid);
                            if (permissionGrants != null
                                    && permissionGrants.containsKey(permissionName)) {
                                return permissionGrants.get(permissionName);
@@ -326,6 +332,7 @@ public interface AccessCheckDelegate extends CheckPermissionDelegate, CheckOpsDe
                        }
                    }
                }
            }

            if (useShellDelegate) {
                final long identity = Binder.clearCallingIdentity();