Loading services/java/com/android/server/pm/KeySetManager.java +24 −9 Original line number Diff line number Diff line Loading @@ -328,13 +328,16 @@ public class KeySetManager { } public void removeAppKeySetData(String packageName) { Log.e(TAG, "Removing application " + packageName); synchronized (mLockObject) { // Get the package's known keys and KeySets Set<Long> deletableKeySets = getKnownKeySetsByPackageName(packageName); Set<Long> deletableKeySets = getKnownKeySetsByPackageNameLocked(packageName); Set<Long> deletableKeys = new HashSet<Long>(); Set<Long> knownKeys = null; for (Long ks : deletableKeySets) { deletableKeys.addAll(mKeySetMapping.get(ks)); knownKeys = mKeySetMapping.get(ks); if (knownKeys != null) { deletableKeys.addAll(knownKeys); } } // Now remove the keys and KeySets known to any other package Loading @@ -342,11 +345,14 @@ public class KeySetManager { if (pkgName.equals(packageName)) { continue; } Set<Long> knownKeySets = getKnownKeySetsByPackageName(pkgName); Set<Long> knownKeySets = getKnownKeySetsByPackageNameLocked(pkgName); deletableKeySets.removeAll(knownKeySets); Set<Long> knownKeys = new HashSet<Long>(); knownKeys = new HashSet<Long>(); for (Long ks : knownKeySets) { deletableKeys.removeAll(mKeySetMapping.get(ks)); knownKeys = mKeySetMapping.get(ks); if (knownKeys != null) { deletableKeys.removeAll(knownKeys); } } } Loading @@ -359,10 +365,19 @@ public class KeySetManager { for (Long keyId : deletableKeys) { mPublicKeys.delete(keyId); } // Now remove them from the KeySets known to each package for (String pkgName : mPackages.keySet()) { PackageSetting p = mPackages.get(packageName); for (Long ks : deletableKeySets) { p.keySetData.removeSigningKeySet(ks); p.keySetData.removeDefinedKeySet(ks); } } } } private Set<Long> getKnownKeySetsByPackageName(String packageName) { private Set<Long> getKnownKeySetsByPackageNameLocked(String packageName) { PackageSetting p = mPackages.get(packageName); if (p == null) { throw new NullPointerException("Unknown package"); Loading @@ -371,10 +386,10 @@ public class KeySetManager { throw new IllegalArgumentException("Package has no keySet data"); } Set<Long> knownKeySets = new HashSet<Long>(); for (Long ks : p.keySetData.getSigningKeySets()) { for (long ks : p.keySetData.getSigningKeySets()) { knownKeySets.add(ks); } for (Long ks : p.keySetData.getDefinedKeySets()) { for (long ks : p.keySetData.getDefinedKeySets()) { knownKeySets.add(ks); } return knownKeySets; Loading services/java/com/android/server/pm/PackageKeySetData.java +34 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,20 @@ public class PackageKeySetData { mSigningKeySets[end] = ks; } public void removeSigningKeySet(long ks) { if (packageIsSignedBy(ks)) { long[] keysets = new long[mSigningKeySets.length - 1]; int index = 0; for (long signingKeySet : mSigningKeySets) { if (signingKeySet != ks) { keysets[index] = signingKeySet; index += 1; } } mSigningKeySets = keysets; } } public void addDefinedKeySet(long ks, String alias) { // deduplicate for (long knownKeySet : mDefinedKeySets) { Loading @@ -68,6 +82,26 @@ public class PackageKeySetData { mKeySetAliases.put(alias, ks); } public void removeDefinedKeySet(long ks) { if (mKeySetAliases.containsValue(ks)) { long[] keysets = new long[mDefinedKeySets.length - 1]; int index = 0; for (long definedKeySet : mDefinedKeySets) { if (definedKeySet != ks) { keysets[index] = definedKeySet; index += 1; } } mDefinedKeySets = keysets; for (String alias : mKeySetAliases.keySet()) { if (mKeySetAliases.get(alias) == ks) { mKeySetAliases.remove(alias); break; } } } } public boolean packageIsSignedBy(long ks) { for (long signingKeySet : mSigningKeySets) { if (ks == signingKeySet) { Loading Loading
services/java/com/android/server/pm/KeySetManager.java +24 −9 Original line number Diff line number Diff line Loading @@ -328,13 +328,16 @@ public class KeySetManager { } public void removeAppKeySetData(String packageName) { Log.e(TAG, "Removing application " + packageName); synchronized (mLockObject) { // Get the package's known keys and KeySets Set<Long> deletableKeySets = getKnownKeySetsByPackageName(packageName); Set<Long> deletableKeySets = getKnownKeySetsByPackageNameLocked(packageName); Set<Long> deletableKeys = new HashSet<Long>(); Set<Long> knownKeys = null; for (Long ks : deletableKeySets) { deletableKeys.addAll(mKeySetMapping.get(ks)); knownKeys = mKeySetMapping.get(ks); if (knownKeys != null) { deletableKeys.addAll(knownKeys); } } // Now remove the keys and KeySets known to any other package Loading @@ -342,11 +345,14 @@ public class KeySetManager { if (pkgName.equals(packageName)) { continue; } Set<Long> knownKeySets = getKnownKeySetsByPackageName(pkgName); Set<Long> knownKeySets = getKnownKeySetsByPackageNameLocked(pkgName); deletableKeySets.removeAll(knownKeySets); Set<Long> knownKeys = new HashSet<Long>(); knownKeys = new HashSet<Long>(); for (Long ks : knownKeySets) { deletableKeys.removeAll(mKeySetMapping.get(ks)); knownKeys = mKeySetMapping.get(ks); if (knownKeys != null) { deletableKeys.removeAll(knownKeys); } } } Loading @@ -359,10 +365,19 @@ public class KeySetManager { for (Long keyId : deletableKeys) { mPublicKeys.delete(keyId); } // Now remove them from the KeySets known to each package for (String pkgName : mPackages.keySet()) { PackageSetting p = mPackages.get(packageName); for (Long ks : deletableKeySets) { p.keySetData.removeSigningKeySet(ks); p.keySetData.removeDefinedKeySet(ks); } } } } private Set<Long> getKnownKeySetsByPackageName(String packageName) { private Set<Long> getKnownKeySetsByPackageNameLocked(String packageName) { PackageSetting p = mPackages.get(packageName); if (p == null) { throw new NullPointerException("Unknown package"); Loading @@ -371,10 +386,10 @@ public class KeySetManager { throw new IllegalArgumentException("Package has no keySet data"); } Set<Long> knownKeySets = new HashSet<Long>(); for (Long ks : p.keySetData.getSigningKeySets()) { for (long ks : p.keySetData.getSigningKeySets()) { knownKeySets.add(ks); } for (Long ks : p.keySetData.getDefinedKeySets()) { for (long ks : p.keySetData.getDefinedKeySets()) { knownKeySets.add(ks); } return knownKeySets; Loading
services/java/com/android/server/pm/PackageKeySetData.java +34 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,20 @@ public class PackageKeySetData { mSigningKeySets[end] = ks; } public void removeSigningKeySet(long ks) { if (packageIsSignedBy(ks)) { long[] keysets = new long[mSigningKeySets.length - 1]; int index = 0; for (long signingKeySet : mSigningKeySets) { if (signingKeySet != ks) { keysets[index] = signingKeySet; index += 1; } } mSigningKeySets = keysets; } } public void addDefinedKeySet(long ks, String alias) { // deduplicate for (long knownKeySet : mDefinedKeySets) { Loading @@ -68,6 +82,26 @@ public class PackageKeySetData { mKeySetAliases.put(alias, ks); } public void removeDefinedKeySet(long ks) { if (mKeySetAliases.containsValue(ks)) { long[] keysets = new long[mDefinedKeySets.length - 1]; int index = 0; for (long definedKeySet : mDefinedKeySets) { if (definedKeySet != ks) { keysets[index] = definedKeySet; index += 1; } } mDefinedKeySets = keysets; for (String alias : mKeySetAliases.keySet()) { if (mKeySetAliases.get(alias) == ks) { mKeySetAliases.remove(alias); break; } } } } public boolean packageIsSignedBy(long ks) { for (long signingKeySet : mSigningKeySets) { if (ks == signingKeySet) { Loading