Merge "Clear binder identity before querying package information" into rvc-dev am: 126d683133

Change-Id: I4ff9e1acc543ef2a1e1282c4eda77cef3c216366
This commit is contained in:
Automerger Merge Worker
2020-03-02 23:29:04 +00:00

View File

@@ -6551,13 +6551,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
// Or ensure calling process is delegatePackage itself. // Or ensure calling process is delegatePackage itself.
} else { } else {
int uid = 0; if (!isCallingFromPackage(delegatePackage, callingUid)) {
try {
uid = mInjector.getPackageManager()
.getPackageUidAsUser(delegatePackage, userId);
} catch(NameNotFoundException e) {
}
if (uid != callingUid) {
throw new SecurityException("Caller with uid " + callingUid + " is not " throw new SecurityException("Caller with uid " + callingUid + " is not "
+ delegatePackage); + delegatePackage);
} }
@@ -6677,15 +6671,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
final List<String> scopes = policy.mDelegationMap.get(callerPackage); final List<String> scopes = policy.mDelegationMap.get(callerPackage);
// Check callingUid only if callerPackage has the required scope delegation. // Check callingUid only if callerPackage has the required scope delegation.
if (scopes != null && scopes.contains(scope)) { if (scopes != null && scopes.contains(scope)) {
try { // Return true if the caller is actually callerPackage.
// Retrieve the expected UID for callerPackage. return isCallingFromPackage(callerPackage, callerUid);
final int uid = mInjector.getPackageManager()
.getPackageUidAsUser(callerPackage, userId);
// Return true if the caller is actually callerPackage.
return uid == callerUid;
} catch (NameNotFoundException e) {
// Ignore.
}
} }
return false; return false;
} }
@@ -8577,14 +8564,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
public void clearDeviceOwner(String packageName) { public void clearDeviceOwner(String packageName) {
Objects.requireNonNull(packageName, "packageName is null"); Objects.requireNonNull(packageName, "packageName is null");
final int callingUid = mInjector.binderGetCallingUid(); final int callingUid = mInjector.binderGetCallingUid();
try { if (!isCallingFromPackage(packageName, callingUid)) {
int uid = mInjector.getPackageManager().getPackageUidAsUser(packageName, throw new SecurityException("Invalid packageName");
UserHandle.getUserId(callingUid));
if (uid != callingUid) {
throw new SecurityException("Invalid packageName");
}
} catch (NameNotFoundException e) {
throw new SecurityException(e);
} }
synchronized (getLockObject()) { synchronized (getLockObject()) {
final ComponentName deviceOwnerComponent = mOwners.getDeviceOwnerComponent(); final ComponentName deviceOwnerComponent = mOwners.getDeviceOwnerComponent();
@@ -12299,14 +12280,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
if (ownerPackage == null) { if (ownerPackage == null) {
ownerPackage = mOwners.getDeviceOwnerPackageName(); ownerPackage = mOwners.getDeviceOwnerPackageName();
} }
final String packageName = ownerPackage;
PackageManager pm = mInjector.getPackageManager(); PackageManager pm = mInjector.getPackageManager();
PackageInfo packageInfo; PackageInfo packageInfo = mInjector.binderWithCleanCallingIdentity(() -> {
try { try {
packageInfo = pm.getPackageInfo(ownerPackage, 0); return pm.getPackageInfo(packageName, 0);
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
Log.e(LOG_TAG, "getPackageInfo error", e); Log.e(LOG_TAG, "getPackageInfo error", e);
return null; return null;
} }
});
if (packageInfo == null) { if (packageInfo == null) {
Log.e(LOG_TAG, "packageInfo is inexplicably null"); Log.e(LOG_TAG, "packageInfo is inexplicably null");
return null; return null;
@@ -12871,13 +12854,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
} }
boolean isPackageInstalledForUser(String packageName, int userHandle) { boolean isPackageInstalledForUser(String packageName, int userHandle) {
try { return mInjector.binderWithCleanCallingIdentity(() -> {
PackageInfo pi = mInjector.getIPackageManager().getPackageInfo(packageName, 0, try {
userHandle); PackageInfo pi = mInjector.getIPackageManager().getPackageInfo(packageName, 0,
return (pi != null) && (pi.applicationInfo.flags != 0); userHandle);
} catch (RemoteException re) { return (pi != null) && (pi.applicationInfo.flags != 0);
throw new RuntimeException("Package manager has died", re); } catch (RemoteException re) {
} throw new RuntimeException("Package manager has died", re);
}
});
} }
public boolean isRuntimePermission(String permissionName) throws NameNotFoundException { public boolean isRuntimePermission(String permissionName) throws NameNotFoundException {
@@ -13942,13 +13927,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
} }
mPackagesToRemove.remove(packageUserPair); mPackagesToRemove.remove(packageUserPair);
} }
try { if (!isPackageInstalledForUser(packageName, userId)) {
if (mInjector.getIPackageManager().getPackageInfo(packageName, 0, userId) == null) { // Package does not exist. Nothing to do.
// Package does not exist. Nothing to do. return;
return;
}
} catch (RemoteException re) {
Log.e(LOG_TAG, "Failure talking to PackageManager while getting package info");
} }
try { // force stop the package before uninstalling try { // force stop the package before uninstalling
@@ -15536,14 +15517,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
} }
private boolean isCallingFromPackage(String packageName, int callingUid) { private boolean isCallingFromPackage(String packageName, int callingUid) {
try { return mInjector.binderWithCleanCallingIdentity(() -> {
final int packageUid = mInjector.getPackageManager().getPackageUidAsUser( try {
packageName, UserHandle.getUserId(callingUid)); final int packageUid = mInjector.getPackageManager().getPackageUidAsUser(
return packageUid == callingUid; packageName, UserHandle.getUserId(callingUid));
} catch (NameNotFoundException e) { return packageUid == callingUid;
Log.d(LOG_TAG, "Calling package not found", e); } catch (NameNotFoundException e) {
return false; Log.d(LOG_TAG, "Calling package not found", e);
} return false;
}
});
} }
private DevicePolicyConstants loadConstants() { private DevicePolicyConstants loadConstants() {