Merge "Clear binder identity before querying package information" into rvc-dev am: 126d683133
Change-Id: I4ff9e1acc543ef2a1e1282c4eda77cef3c216366
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user