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

Commit f9f22b63 authored by Mohammad Samiul Islam's avatar Mohammad Samiul Islam Committed by Automerger Merge Worker
Browse files

Prevent exceptions in pre-reboot verification from crashing system server am: fdf525f5

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12911056

Change-Id: I0e9e1a1bfb8061e9543943bed4342bbacd7ece82
parents 5649ba12 fdf525f5
Loading
Loading
Loading
Loading
+51 −13
Original line number Diff line number Diff line
@@ -1077,6 +1077,26 @@ public class StagingManager {
        return true;
    }

    /**
     * Ensure that there is no active apex session staged in apexd for the given session.
     *
     * @return returns true if it is ensured that there is no active apex session, otherwise false
     */
    private boolean ensureActiveApexSessionIsAborted(PackageInstallerSession session) {
        if (!sessionContainsApex(session)) {
            return true;
        }
        final ApexSessionInfo apexSession = mApexManager.getStagedSessionInfo(session.sessionId);
        if (apexSession == null || isApexSessionFinalized(apexSession)) {
            return true;
        }
        try {
            return mApexManager.abortStagedSession(session.sessionId);
        } catch (PackageManagerException ignore) {
            return false;
        }
    }

    private boolean isApexSessionFinalized(ApexSessionInfo session) {
        /* checking if the session is in a final state, i.e., not active anymore */
        return session.isUnknown || session.isActivationFailed || session.isSuccess
@@ -1308,6 +1328,7 @@ public class StagingManager {
                onPreRebootVerificationComplete(sessionId);
                return;
            }
            try {
                switch (msg.what) {
                    case MSG_PRE_REBOOT_VERIFICATION_START:
                        handlePreRebootVerification_Start(session);
@@ -1322,6 +1343,12 @@ public class StagingManager {
                        handlePreRebootVerification_End(session);
                        break;
                }
            } catch (Exception e) {
                Slog.e(TAG, "Pre-reboot verification failed due to unhandled exception", e);
                onPreRebootVerificationFailure(session,
                        SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
                        "Pre-reboot verification failed due to unhandled exception: " + e);
            }
        }

        // Notify the handler that system is ready, and reschedule the pre-reboot verifications.
@@ -1357,6 +1384,17 @@ public class StagingManager {
            obtainMessage(MSG_PRE_REBOOT_VERIFICATION_START, sessionId, 0).sendToTarget();
        }

        private void onPreRebootVerificationFailure(PackageInstallerSession session,
                @SessionInfo.StagedSessionErrorCode int errorCode, String errorMessage) {
            if (!ensureActiveApexSessionIsAborted(session)) {
                Slog.e(TAG, "Failed to abort apex session " + session.sessionId);
                // Safe to ignore active apex session abortion failure since session will be marked
                // failed on next step and staging directory for session will be deleted.
            }
            session.setStagedSessionFailed(errorCode, errorMessage);
            onPreRebootVerificationComplete(session.sessionId);
        }

        // Things to do when pre-reboot verification completes for a particular sessionId
        private void onPreRebootVerificationComplete(int sessionId) {
            // Remove it from mVerificationRunning so that verification is considered complete