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

Commit 00ab1ef9 authored by Song Chun Fan's avatar Song Chun Fan Committed by Android (Google) Code Review
Browse files

Merge "[pm] prevent changing sharedUserId after uninstall -k" into main

parents 80728d54 68117419
Loading
Loading
Loading
Loading
+29 −18
Original line number Diff line number Diff line
@@ -1801,12 +1801,24 @@ final class InstallPackageHelper {
                                oldPackageState.getRestrictUpdateHash());
                    }

                    if (oldPackage != null) {
                    // APK should not change its sharedUserId declarations
                        final var oldSharedUid = oldPackage.getSharedUserId() != null
                                ? oldPackage.getSharedUserId() : "<nothing>";
                        final var newSharedUid = parsedPackage.getSharedUserId() != null
                    final String oldSharedUid;
                    if (mPm.mSettings.getSharedUserSettingLPr(oldPackageState) != null) {
                        oldSharedUid = mPm.mSettings.getSharedUserSettingLPr(oldPackageState).name;
                    } else {
                        oldSharedUid = "<nothing>";
                    }
                    String newSharedUid = parsedPackage.getSharedUserId() != null
                            ? parsedPackage.getSharedUserId() : "<nothing>";
                    // If the previously installed app version doesn't have sharedUserSetting,
                    // check that the new apk either doesn't have sharedUserId or it is leaving one.
                    // If it contains sharedUserId but it is also leaving it, it's ok to proceed.
                    if (oldSharedUid.equals("<nothing>")) {
                        if (parsedPackage.isLeavingSharedUser()) {
                            newSharedUid = "<nothing>";
                        }
                    }

                    if (!oldSharedUid.equals(newSharedUid)) {
                        throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED,
                                "Package " + parsedPackage.getPackageName()
@@ -1815,13 +1827,12 @@ final class InstallPackageHelper {
                    }

                    // APK should not re-join shared UID
                        if (oldPackage.isLeavingSharedUser()
                    if (oldPackageState.isLeavingSharedUser()
                            && !parsedPackage.isLeavingSharedUser()) {
                        throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED,
                                "Package " + parsedPackage.getPackageName()
                                        + " attempting to rejoin " + newSharedUid);
                    }
                    }

                    // In case of rollback, remember per-user/profile install state
                    installedUsers = ps.queryInstalledUsers(allUsers, true);
+16 −0
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
                SCANNED_AS_STOPPED_SYSTEM_APP,
                PENDING_RESTORE,
                DEBUGGABLE,
                IS_LEAVING_SHARED_USER,
        })
        public @interface Flags {
        }
@@ -107,6 +108,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
        private static final int SCANNED_AS_STOPPED_SYSTEM_APP = 1 << 3;
        private static final int PENDING_RESTORE = 1 << 4;
        private static final int DEBUGGABLE = 1 << 5;
        private static final int IS_LEAVING_SHARED_USER = 1 << 6;
    }
    private int mBooleans;

@@ -594,6 +596,20 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
        return getBoolean(Booleans.DEBUGGABLE);
    }

    /**
     * @see PackageState#isLeavingSharedUser
     */
    public PackageSetting setLeavingSharedUser(boolean value) {
        setBoolean(Booleans.IS_LEAVING_SHARED_USER, value);
        onChanged();
        return this;
    }

    @Override
    public boolean isLeavingSharedUser() {
        return getBoolean(Booleans.IS_LEAVING_SHARED_USER);
    }

    /**
     * @see AndroidPackage#getBaseRevisionCode
     */
+1 −0
Original line number Diff line number Diff line
@@ -482,6 +482,7 @@ final class ScanPackageUtils {
                            + " to " + volumeUuid);
            pkgSetting.setVolumeUuid(volumeUuid);
        }
        pkgSetting.setLeavingSharedUser(parsedPackage.isLeavingSharedUser());

        SharedLibraryInfo sdkLibraryInfo = null;
        if (!TextUtils.isEmpty(parsedPackage.getSdkLibraryName())) {
+6 −0
Original line number Diff line number Diff line
@@ -488,4 +488,10 @@ public interface PackageState {
     * @hide
     */
    boolean isScannedAsStoppedSystemApp();

    /**
     * see AndroidPackage#isLeavingSharedUser()
     * @hide
     */
    boolean isLeavingSharedUser();
}