Revert "Revert "Update signature permissions when package signing is changed.""

This reverts commit 2eaf848839.
Reason for revert: Fixed SigningDetails.equals() NPE in b/290558495

Fixes: 288515966
Test: KeySetHostTest#testUpgradeDefinerSigPerm{Gained,Lost}
Test: Reproduction steps in b/290558495
Change-Id: I694a565957576633ba7e1424c49a77d97fcdff26
This commit is contained in:
Hai Zhang
2023-07-10 09:49:47 +00:00
parent 2eaf848839
commit 6b955f6c9f
2 changed files with 15 additions and 6 deletions

View File

@@ -867,10 +867,12 @@ public final class SigningDetails implements Parcelable {
return false;
}
// The capabilities for the past signing certs must match as well.
for (int i = 0; i < mPastSigningCertificates.length; i++) {
if (mPastSigningCertificates[i].getFlags()
!= that.mPastSigningCertificates[i].getFlags()) {
return false;
if (mPastSigningCertificates != null) {
for (int i = 0; i < mPastSigningCertificates.length; i++) {
if (mPastSigningCertificates[i].getFlags()
!= that.mPastSigningCertificates[i].getFlags()) {
return false;
}
}
}
return true;

View File

@@ -390,7 +390,14 @@ class AppIdPermissionPolicy : SchemePolicy() {
packageState: PackageState,
changedPermissionNames: MutableIndexedSet<String>
) {
packageState.androidPackage!!.permissions.forEachIndexed { _, parsedPermission ->
val androidPackage = packageState.androidPackage!!
// This may not be the same package as the old permission because the old permission owner
// can be different, hence using this somewhat strange name to prevent misuse.
val oldNewPackage = oldState.externalState.packageStates[packageState.packageName]
?.androidPackage
val isPackageSigningChanged = oldNewPackage != null &&
androidPackage.signingDetails != oldNewPackage.signingDetails
androidPackage.permissions.forEachIndexed { _, parsedPermission ->
val newPermissionInfo = PackageInfoUtils.generatePermissionInfo(
parsedPermission, PackageManager.GET_META_DATA.toLong()
)!!
@@ -520,7 +527,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
newPackageName != oldPermission.packageName ||
newPermission.protectionLevel != oldPermission.protectionLevel || (
oldPermission.isReconciled && (
(
(newPermission.isSignature && isPackageSigningChanged) || (
newPermission.isKnownSigner &&
newPermission.knownCerts != oldPermission.knownCerts
) || (