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

Commit 119e0c57 authored by Joanne Chung's avatar Joanne Chung
Browse files

Avoid crashing system if the installed user doesn't existing

It is possible the user may be removed during the package install,
and it may happen frequently in the auto testing. This may cause
the system crash. Instead of making system crash, we add an user
checking in the code that may crash the system to report error to
the caller.

It's good to get notified when the user is removed and the util can
do a better handle here. We will try to go through in the follow up
bug later.

Bug: 301203319
Test: manual. Comment the install shell command user checking code
and install package on invalid user.

Change-Id: I168fe55d4a0604ec86f502ac8e434407739478ea
parent ae878a61
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -2200,12 +2200,19 @@ final class InstallPackageHelper {
        final String installerPackageName = installRequest.getInstallerPackageName();

        if (DEBUG_INSTALL) Slog.d(TAG, "New package installed in " + pkg.getPath());
        final int userId = installRequest.getUserId();
        if (userId != UserHandle.USER_ALL && userId != UserHandle.USER_CURRENT
                && !mPm.mUserManager.exists(userId)) {
            installRequest.setError(PackageManagerException.ofInternalError(
                    "User " + userId + " doesn't exist or has been removed",
                    PackageManagerException.INTERNAL_ERROR_MISSING_USER));
            return;
        }
        synchronized (mPm.mLock) {
            // For system-bundled packages, we assume that installing an upgraded version
            // of the package implies that the user actually wants to run that new code,
            // so we enable the package.
            final PackageSetting ps = mPm.mSettings.getPackageLPr(pkgName);
            final int userId = installRequest.getUserId();
            if (ps != null) {
                if (ps.isSystem()) {
                    if (DEBUG_INSTALL) {
+1 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ public class PackageManagerException extends Exception {
    public static final int INTERNAL_ERROR_STATIC_SHARED_LIB_OVERLAY_TARGETS = -35;
    public static final int INTERNAL_ERROR_APEX_NOT_DIRECTORY = -36;
    public static final int INTERNAL_ERROR_APEX_MORE_THAN_ONE_FILE = -37;
    public static final int INTERNAL_ERROR_MISSING_USER = -38;

    @IntDef(prefix = { "INTERNAL_ERROR_" }, value = {
            INTERNAL_ERROR_NATIVE_LIBRARY_COPY,