Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea6bf362 authored by Kenny Root's avatar Kenny Root
Browse files

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
parent 5a40b8ef
Loading
Loading
Loading
Loading
+70 −12
Original line number Diff line number Diff line
@@ -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 |
@@ -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;