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

Commit 322a96e6 authored by Yasin Kilicdere's avatar Yasin Kilicdere
Browse files

Fix early call of UMS.removeUser causing system crash during boot.

When the removal of a user is initiated from shell command during boot,
before ActivityManager is ready, sending the user removal broadcasts throw an IllegalStateException causing FATAL Exception in system.

This CL adds a check to removeUser method to make sure ActivityManager
is ready before moving on.

Bug: 358267321
Change-Id: I51dfb73f2aada22b5cd56d734f36998cb17cfd50
Test: None
Flag: EXEMPT bugfix
parent 254b854c
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -379,6 +379,10 @@ public class UserManagerService extends IUserManager.Stub {

    /** Count down latch to wait while boot user is not set.*/
    private final CountDownLatch mBootUserLatch = new CountDownLatch(1);

    /** Current boot phase. */
    private @SystemService.BootPhase int mCurrentBootPhase;

    /**
     * Internal non-parcelable wrapper for UserInfo that is not exposed to other system apps.
     */
@@ -968,6 +972,7 @@ public class UserManagerService extends IUserManager.Stub {

        @Override
        public void onBootPhase(int phase) {
            mUms.mCurrentBootPhase = phase;
            if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
                mUms.cleanupPartialUsers();

@@ -6204,6 +6209,11 @@ public class UserManagerService extends IUserManager.Stub {
            Slog.w(LOG_TAG, "Cannot remove user. " + restriction + " is enabled.");
            return false;
        }
        if (mCurrentBootPhase < SystemService.PHASE_ACTIVITY_MANAGER_READY) {
            Slog.w(LOG_TAG, "Cannot remove user, removeUser is called too early during boot. "
                + "ActivityManager is not ready yet.");
            return false;
        }
        return removeUserWithProfilesUnchecked(userId);
    }