summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java45
1 files changed, 38 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 32aeea809b87..2d6b5ef8b607 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -267,6 +267,7 @@ import static android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
import static android.content.pm.PackageManager.GET_PROVIDERS;
import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
+import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
@@ -7820,7 +7821,7 @@ public final class ActivityManagerService extends ActivityManagerNative
return ActivityManager.APP_START_MODE_NORMAL;
}
- private ProviderInfo getProviderInfoLocked(String authority, int userHandle) {
+ private ProviderInfo getProviderInfoLocked(String authority, int userHandle, int pmFlags) {
ProviderInfo pi = null;
ContentProviderRecord cpr = mProviderMap.getProviderByName(authority, userHandle);
if (cpr != null) {
@@ -7828,7 +7829,8 @@ public final class ActivityManagerService extends ActivityManagerNative
} else {
try {
pi = AppGlobals.getPackageManager().resolveContentProvider(
- authority, PackageManager.GET_URI_PERMISSION_PATTERNS, userHandle);
+ authority, PackageManager.GET_URI_PERMISSION_PATTERNS | pmFlags,
+ userHandle);
} catch (RemoteException ex) {
}
}
@@ -7951,7 +7953,8 @@ public final class ActivityManagerService extends ActivityManagerNative
}
final String authority = grantUri.uri.getAuthority();
- final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId);
+ final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId,
+ MATCH_DEBUG_TRIAGED_MISSING);
if (pi == null) {
Slog.w(TAG, "No content provider found for permission check: " +
grantUri.uri.toSafeString());
@@ -8078,7 +8081,8 @@ public final class ActivityManagerService extends ActivityManagerNative
"Granting " + targetPkg + "/" + targetUid + " permission to " + grantUri);
final String authority = grantUri.uri.getAuthority();
- final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId);
+ final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId,
+ MATCH_DEBUG_TRIAGED_MISSING);
if (pi == null) {
Slog.w(TAG, "No content provider found for grant: " + grantUri.toSafeString());
return;
@@ -8293,7 +8297,8 @@ public final class ActivityManagerService extends ActivityManagerNative
final IPackageManager pm = AppGlobals.getPackageManager();
final String authority = grantUri.uri.getAuthority();
- final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId);
+ final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId,
+ MATCH_DEBUG_TRIAGED_MISSING);
if (pi == null) {
Slog.w(TAG, "No content provider found for permission revoke: "
+ grantUri.toSafeString());
@@ -8390,7 +8395,8 @@ public final class ActivityManagerService extends ActivityManagerNative
}
final String authority = uri.getAuthority();
- final ProviderInfo pi = getProviderInfoLocked(authority, userId);
+ final ProviderInfo pi = getProviderInfoLocked(authority, userId,
+ MATCH_DEBUG_TRIAGED_MISSING);
if (pi == null) {
Slog.w(TAG, "No content provider found for permission revoke: "
+ uri.toSafeString());
@@ -8624,8 +8630,11 @@ public final class ActivityManagerService extends ActivityManagerNative
final long createdTime = readLongAttribute(in, ATTR_CREATED_TIME, now);
// Sanity check that provider still belongs to source package
+ // Both direct boot aware and unaware packages are fine as we
+ // will do filtering at query time to avoid multiple parsing.
final ProviderInfo pi = getProviderInfoLocked(
- uri.getAuthority(), sourceUserId);
+ uri.getAuthority(), sourceUserId, MATCH_DIRECT_BOOT_AWARE
+ | MATCH_DIRECT_BOOT_UNAWARE);
if (pi != null && sourcePkg.equals(pi.packageName)) {
int targetUid = -1;
try {
@@ -8804,8 +8813,30 @@ public final class ActivityManagerService extends ActivityManagerNative
if (perms == null) {
Slog.w(TAG, "No permission grants found for " + packageName);
} else {
+ final int userId = UserHandle.getUserId(callingUid);
+ Set<String> existingAuthorities = null;
+
for (UriPermission perm : perms.values()) {
if (packageName.equals(perm.targetPkg) && perm.persistedModeFlags != 0) {
+ // Is this provider available in the current boot state? If the user
+ // is not running and unlocked we check if the provider package exists.
+ if (!mUserController.isUserRunningLocked(userId,
+ ActivityManager.FLAG_AND_UNLOCKED)) {
+ String authority = perm.uri.uri.getAuthority();
+ if (existingAuthorities == null
+ || !existingAuthorities.contains(authority)) {
+ ProviderInfo providerInfo = getProviderInfoLocked(authority,
+ userId, MATCH_DEBUG_TRIAGED_MISSING);
+ if (providerInfo != null) {
+ if (existingAuthorities == null) {
+ existingAuthorities = new ArraySet<>();
+ }
+ existingAuthorities.add(authority);
+ } else {
+ continue;
+ }
+ }
+ }
result.add(perm.buildPersistedPublicApiObject());
}
}