Merge "Backporting of b/77821568" into oc-dev

This commit is contained in:
Atanas Kirilov
2018-06-27 23:25:27 +00:00
committed by Android (Google) Code Review

View File

@@ -4473,7 +4473,9 @@ public class PackageManagerService extends IPackageManager.Stub
triaged = false; triaged = false;
} }
if ((flags & PackageManager.MATCH_ANY_USER) != 0) { if ((flags & PackageManager.MATCH_ANY_USER) != 0) {
enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, // require the permission to be held; the calling uid and given user id referring
// to the same user is not sufficient
enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, true,
"MATCH_ANY_USER flag requires INTERACT_ACROSS_USERS permission at " "MATCH_ANY_USER flag requires INTERACT_ACROSS_USERS permission at "
+ Debug.getCallers(5)); + Debug.getCallers(5));
} else if ((flags & PackageManager.MATCH_UNINSTALLED_PACKAGES) != 0 && isCallerSystemUser } else if ((flags & PackageManager.MATCH_UNINSTALLED_PACKAGES) != 0 && isCallerSystemUser
@@ -5126,13 +5128,25 @@ public class PackageManagerService extends IPackageManager.Stub
*/ */
void enforceCrossUserPermission(int callingUid, int userId, boolean requireFullPermission, void enforceCrossUserPermission(int callingUid, int userId, boolean requireFullPermission,
boolean checkShell, String message) { boolean checkShell, String message) {
enforceCrossUserPermission(
callingUid,
userId,
requireFullPermission,
checkShell,
false,
message);
}
private void enforceCrossUserPermission(int callingUid, int userId,
boolean requireFullPermission, boolean checkShell,
boolean requirePermissionWhenSameUser, String message) {
if (userId < 0) { if (userId < 0) {
throw new IllegalArgumentException("Invalid userId " + userId); throw new IllegalArgumentException("Invalid userId " + userId);
} }
if (checkShell) { if (checkShell) {
enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, userId); enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, userId);
} }
if (userId == UserHandle.getUserId(callingUid)) return; if (!requirePermissionWhenSameUser && userId == UserHandle.getUserId(callingUid)) return;
if (callingUid != Process.SYSTEM_UID && callingUid != 0) { if (callingUid != Process.SYSTEM_UID && callingUid != 0) {
if (requireFullPermission) { if (requireFullPermission) {
mContext.enforceCallingOrSelfPermission( mContext.enforceCallingOrSelfPermission(
@@ -8194,7 +8208,7 @@ public class PackageManagerService extends IPackageManager.Stub
flags = updateFlagsForPackage(flags, userId, null); flags = updateFlagsForPackage(flags, userId, null);
final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0; final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0;
enforceCrossUserPermission(callingUid, userId, enforceCrossUserPermission(callingUid, userId,
true /* requireFullPermission */, false /* checkShell */, false /* requireFullPermission */, false /* checkShell */,
"get installed packages"); "get installed packages");
// writer // writer
@@ -8318,6 +8332,13 @@ public class PackageManagerService extends IPackageManager.Stub
flags = updateFlagsForApplication(flags, userId, null); flags = updateFlagsForApplication(flags, userId, null);
final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0; final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0;
enforceCrossUserPermission(
callingUid,
userId,
false /* requireFullPermission */,
false /* checkShell */,
"get installed application info");
// writer // writer
synchronized (mPackages) { synchronized (mPackages) {
ArrayList<ApplicationInfo> list; ArrayList<ApplicationInfo> list;