summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorKenny Root <kroot@google.com>2011-01-13 14:53:17 -0800
committerKenny Root <kroot@google.com>2011-01-14 10:32:42 -0800
commitea6bf3628140283df24f2652b686d083b0d31ed9 (patch)
tree5076f5a3dd757da02a2099099ebfb2deabab1f1d /services
parent5a40b8ef81034e00f886010c71dccd62b919028b (diff)
downloadframeworks_base-ea6bf3628140283df24f2652b686d083b0d31ed9.zip
frameworks_base-ea6bf3628140283df24f2652b686d083b0d31ed9.tar.gz
frameworks_base-ea6bf3628140283df24f2652b686d083b0d31ed9.tar.bz2
Deep clone settings for system package update DO NOT MERGE
The copyFrom() method was not written to create a clone of the PackageSetting, so just create a new constructor that actually does a clone. Bug: 3349588 Change-Id: I24bdce6c3559e097ecb64b61585ef3b12bca491f
Diffstat (limited to 'services')
-rw-r--r--services/java/com/android/server/PackageManagerService.java82
1 files changed, 70 insertions, 12 deletions
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index d00c043..39c7540 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -7408,6 +7408,12 @@ class PackageManagerService extends IPackageManager.Stub {
static class PackageSignatures {
private Signature[] mSignatures;
+ PackageSignatures(PackageSignatures orig) {
+ if (orig != null && orig.mSignatures != null) {
+ mSignatures = orig.mSignatures.clone();
+ }
+ }
+
PackageSignatures(Signature[] sigs) {
assignSignatures(sigs);
}
@@ -7743,6 +7749,15 @@ class PackageManagerService extends IPackageManager.Stub {
setFlags(pkgFlags);
}
+ GrantedPermissions(GrantedPermissions base) {
+ pkgFlags = base.pkgFlags;
+ grantedPermissions = (HashSet<String>) base.grantedPermissions.clone();
+
+ if (base.gids != null) {
+ gids = base.gids.clone();
+ }
+ }
+
void setFlags(int pkgFlags) {
this.pkgFlags = pkgFlags & (
ApplicationInfo.FLAG_SYSTEM |
@@ -7770,7 +7785,7 @@ class PackageManagerService extends IPackageManager.Stub {
int versionCode;
boolean uidError;
-
+
PackageSignatures signatures = new PackageSignatures();
boolean permissionsFixed;
@@ -7796,6 +7811,48 @@ class PackageManagerService extends IPackageManager.Stub {
init(codePath, resourcePath, nativeLibraryPathString, pVersionCode);
}
+ /**
+ * New instance of PackageSetting with one-level-deep cloning.
+ */
+ PackageSettingBase(PackageSettingBase base) {
+ super(base);
+
+ name = base.name;
+ realName = base.realName;
+ codePath = base.codePath;
+ codePathString = base.codePathString;
+ resourcePath = base.resourcePath;
+ resourcePathString = base.resourcePathString;
+ nativeLibraryPathString = base.nativeLibraryPathString;
+
+ if (base.obbPathStrings != null) {
+ obbPathStrings = base.obbPathStrings.clone();
+ }
+
+ timeStamp = base.timeStamp;
+ firstInstallTime = base.firstInstallTime;
+ lastUpdateTime = base.lastUpdateTime;
+ versionCode = base.versionCode;
+
+ uidError = base.uidError;
+
+ signatures = new PackageSignatures(base.signatures);
+
+ permissionsFixed = base.permissionsFixed;
+ haveGids = base.haveGids;
+
+ disabledComponents = (HashSet<String>) base.disabledComponents.clone();
+
+ enabledComponents = (HashSet<String>) base.enabledComponents.clone();
+
+ enabled = base.enabled;
+ installStatus = base.installStatus;
+
+ origPackage = base.origPackage;
+
+ installerPackageName = base.installerPackageName;
+ }
+
void init(File codePath, File resourcePath, String nativeLibraryPathString,
int pVersionCode) {
this.codePath = codePath;
@@ -7826,6 +7883,9 @@ class PackageManagerService extends IPackageManager.Stub {
timeStamp = newStamp;
}
+ /**
+ * Make a shallow copy of this package settings.
+ */
public void copyFrom(PackageSettingBase base) {
grantedPermissions = base.grantedPermissions;
gids = base.gids;
@@ -7885,18 +7945,16 @@ class PackageManagerService extends IPackageManager.Stub {
pkgFlags);
}
+ /**
+ * New instance of PackageSetting replicating the original settings.
+ * Note that it keeps the same PackageParser.Package instance.
+ */
PackageSetting(PackageSetting orig) {
- super(orig.name, orig.realName, orig.codePath, orig.resourcePath,
- orig.nativeLibraryPathString, orig.versionCode, orig.pkgFlags);
- copyFrom(orig);
- }
-
- public void copyFrom(PackageSetting base) {
- super.copyFrom((PackageSettingBase) base);
+ super(orig);
- userId = base.userId;
- sharedUser = base.sharedUser;
- pkg = base.pkg;
+ userId = orig.userId;
+ pkg = orig.pkg;
+ sharedUser = orig.sharedUser;
}
@Override
@@ -8128,7 +8186,7 @@ class PackageManagerService extends IPackageManager.Stub {
// a little trick... when we install the new package, we don't
// want to modify the existing PackageSetting for the built-in
// version. so at this point we need a new PackageSetting that
- // is okay to much with.
+ // is okay to muck with.
PackageSetting newp = new PackageSetting(p);
replacePackageLP(name, newp);
return true;