From 9bbaacf845f6f387cd6e16834da50f7c1a0b451f Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Mon, 20 Jun 2016 14:03:44 -0700 Subject: [PATCH] Use granted userId to look up provider info In getPersistedUriPermissions, use granted userId instead of the calling userId to look up provider info. Bug: 29058113 Change-Id: Ia637be414f9ef3b8e9bce13bb56bd335cfb28ac7 --- .../java/android/content/ContentResolver.java | 2 ++ .../server/am/ActivityManagerService.java | 31 +++---------------- 2 files changed, 7 insertions(+), 26 deletions(-) diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index aeda7a24066d8..c8d89204d8d48 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -1819,6 +1819,7 @@ public abstract class ContentResolver { * calling app. That is, the returned permissions have been granted * to the calling app. Only persistable grants taken with * {@link #takePersistableUriPermission(Uri, int)} are returned. + *

Note: Some of the returned URIs may not be usable until after the user is unlocked. * * @see #takePersistableUriPermission(Uri, int) * @see #releasePersistableUriPermission(Uri, int) @@ -1837,6 +1838,7 @@ public abstract class ContentResolver { * calling app. That is, the returned permissions have been granted * from the calling app. Only grants taken with * {@link #takePersistableUriPermission(Uri, int)} are returned. + *

Note: Some of the returned URIs may not be usable until after the user is unlocked. */ public @NonNull List getOutgoingPersistedUriPermissions() { try { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 159a1bf89800e..be5eda351c247 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -8333,7 +8333,7 @@ public final class ActivityManagerService extends ActivityManagerNative final IPackageManager pm = AppGlobals.getPackageManager(); final String authority = grantUri.uri.getAuthority(); final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId, - MATCH_DEBUG_TRIAGED_MISSING); + MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE); if (pi == null) { Slog.w(TAG, "No content provider found for permission revoke: " + grantUri.toSafeString()); @@ -8431,7 +8431,7 @@ public final class ActivityManagerService extends ActivityManagerNative final String authority = uri.getAuthority(); final ProviderInfo pi = getProviderInfoLocked(authority, userId, - MATCH_DEBUG_TRIAGED_MISSING); + MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE); if (pi == null) { Slog.w(TAG, "No content provider found for permission revoke: " + uri.toSafeString()); @@ -8828,10 +8828,11 @@ public final class ActivityManagerService extends ActivityManagerNative Preconditions.checkNotNull(packageName, "packageName"); final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); final IPackageManager pm = AppGlobals.getPackageManager(); try { - final int packageUid = pm.getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, - UserHandle.getUserId(callingUid)); + final int packageUid = pm.getPackageUid(packageName, + MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, callingUserId); if (packageUid != callingUid) { throw new SecurityException( "Package " + packageName + " does not belong to calling UID " + callingUid); @@ -8848,30 +8849,8 @@ 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 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()); } }