summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java35
-rw-r--r--services/core/java/com/android/server/pm/permission/TEST_MAPPING3
2 files changed, 18 insertions, 20 deletions
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 9ede263284a1..d45a8ef4e0ae 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -922,6 +922,8 @@ public class PermissionManagerService {
permissionsState.setGlobalGids(mGlobalGids);
synchronized (mLock) {
+ ArraySet<String> newImplicitPermissions = new ArraySet<>();
+
final int N = pkg.requestedPermissions.size();
for (int i = 0; i < N; i++) {
final String permName = pkg.requestedPermissions.get(i);
@@ -943,6 +945,17 @@ public class PermissionManagerService {
continue;
}
+ // Cache newImplicitPermissions before modifing permissionsState as for the shared
+ // uids the original and new state are the same object
+ if (!origPermissions.hasRequestedPermission(permName)
+ && pkg.implicitPermissions.contains(permName)) {
+ newImplicitPermissions.add(permName);
+
+ if (DEBUG_PERMISSIONS) {
+ Slog.i(TAG, permName + " is newly added for " + pkg.packageName);
+ }
+ }
+
// Limit ephemeral apps to ephemeral allowed permissions.
if (pkg.applicationInfo.isInstantApp() && !bp.isInstant()) {
if (DEBUG_PERMISSIONS) {
@@ -1298,7 +1311,7 @@ public class PermissionManagerService {
updatedUserIds = revokePermissionsNoLongerImplicitLocked(permissionsState, pkg,
updatedUserIds);
updatedUserIds = setInitialGrantForNewImplicitPermissionsLocked(origPermissions,
- permissionsState, pkg, updatedUserIds);
+ permissionsState, pkg, newImplicitPermissions, updatedUserIds);
}
// Persist the runtime permissions state for users with changes. If permissions
@@ -1437,27 +1450,9 @@ public class PermissionManagerService {
private @NonNull int[] setInitialGrantForNewImplicitPermissionsLocked(
@NonNull PermissionsState origPs,
@NonNull PermissionsState ps, @NonNull PackageParser.Package pkg,
+ @NonNull ArraySet<String> newImplicitPermissions,
@NonNull int[] updatedUserIds) {
String pkgName = pkg.packageName;
- ArraySet<String> newImplicitPermissions = new ArraySet<>();
-
- int numRequestedPerms = pkg.requestedPermissions.size();
- for (int i = 0; i < numRequestedPerms; i++) {
- BasePermission bp = mSettings.getPermissionLocked(pkg.requestedPermissions.get(i));
- if (bp != null) {
- String perm = bp.getName();
-
- if (!origPs.hasRequestedPermission(perm) && pkg.implicitPermissions.contains(
- perm)) {
- newImplicitPermissions.add(perm);
-
- if (DEBUG_PERMISSIONS) {
- Slog.i(TAG, perm + " is newly added for " + pkgName);
- }
- }
- }
- }
-
ArrayMap<String, ArraySet<String>> newToSplitPerms = new ArrayMap<>();
int numSplitPerms = PermissionManager.SPLIT_PERMISSIONS.size();
diff --git a/services/core/java/com/android/server/pm/permission/TEST_MAPPING b/services/core/java/com/android/server/pm/permission/TEST_MAPPING
index 05e9b93bcf5a..c27270712058 100644
--- a/services/core/java/com/android/server/pm/permission/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/permission/TEST_MAPPING
@@ -11,6 +11,9 @@
},
{
"include-filter": "android.permission.cts.PermissionFlagsTest"
+ },
+ {
+ "include-filter": "android.permission.cts.SharedUidPermissionsTest"
}
]
},