summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java18
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionSettings.java15
2 files changed, 29 insertions, 4 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 65a122e89c15..72c8b22f77e7 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -843,7 +843,23 @@ public class PermissionManagerService extends IPermissionManager.Stub {
private boolean checkSinglePermissionInternal(int uid,
@NonNull PermissionsState permissionsState, @NonNull String permissionName) {
- if (!permissionsState.hasPermission(permissionName, UserHandle.getUserId(uid))) {
+ boolean hasPermission = permissionsState.hasPermission(permissionName,
+ UserHandle.getUserId(uid));
+
+ if (!hasPermission && mSettings.isPermissionRuntime(permissionName)) {
+ final String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid);
+ final int packageNamesSize = packageNames != null ? packageNames.length : 0;
+ for (int i = 0; i < packageNamesSize; i++) {
+ final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageNames[i]);
+ if (pkg != null && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M
+ && pkg.requestedPermissions.contains(permissionName)) {
+ hasPermission = true;
+ break;
+ }
+ }
+ }
+
+ if (!hasPermission) {
return false;
}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionSettings.java b/services/core/java/com/android/server/pm/permission/PermissionSettings.java
index 920803241b49..3d8cf2ddc2cc 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionSettings.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionSettings.java
@@ -18,13 +18,11 @@ package com.android.server.pm.permission;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.content.Context;
import android.content.pm.PackageParser;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
-import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.XmlUtils;
import com.android.server.pm.DumpState;
@@ -37,7 +35,6 @@ import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
-import java.util.Set;
/**
* Permissions and other related data. This class is not meant for
@@ -249,6 +246,18 @@ public class PermissionSettings {
}
}
+ /**
+ * Check whether a permission is runtime.
+ *
+ * @see BasePermission#isRuntime()
+ */
+ public boolean isPermissionRuntime(@NonNull String permName) {
+ synchronized (mLock) {
+ final BasePermission bp = mPermissions.get(permName);
+ return (bp != null && bp.isRuntime());
+ }
+ }
+
public boolean isPermissionInstant(String permName) {
synchronized (mLock) {
final BasePermission bp = mPermissions.get(permName);