diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/StagingManager.java | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index c842ff1b11a5..cb78636065aa 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -737,31 +737,31 @@ public class StagingManager { continue; } - // New session cannot have same package name as one of the active sessions - if (stagedSession.sessionContains(s -> s.getPackageName().equals(packageName))) { - if (isRollback) { - // If the new session is a rollback, then it gets priority. The existing - // session is failed to unblock rollback. - final StagedSession root = stagedSession; - if (!ensureActiveApexSessionIsAborted(root)) { - Slog.e(TAG, "Failed to abort apex session " + root.sessionId()); - // Safe to ignore active apex session abort failure since session - // will be marked failed on next step and staging directory for session - // will be deleted. - } - root.setSessionFailed( - SessionInfo.STAGED_SESSION_CONFLICT, - "Session was blocking rollback session: " + session.sessionId()); - Slog.i(TAG, "Session " + root.sessionId() + " is marked failed due to " - + "blocking rollback session: " + session.sessionId()); - } else { - throw new PackageManagerException( - SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, - "Package: " + session.getPackageName() + " in session: " - + session.sessionId() - + " has been staged already by session: " - + stagedSession.sessionId(), null); + if (isRollback && !isRollback(stagedSession)) { + // If the new session is a rollback, then it gets priority. The existing + // session is failed to reduce risk and avoid an SDK extension dependency + // violation. + final StagedSession root = stagedSession; + if (!ensureActiveApexSessionIsAborted(root)) { + Slog.e(TAG, "Failed to abort apex session " + root.sessionId()); + // Safe to ignore active apex session abort failure since session + // will be marked failed on next step and staging directory for session + // will be deleted. } + root.setSessionFailed( + SessionInfo.STAGED_SESSION_CONFLICT, + "Session was failed by rollback session: " + session.sessionId()); + Slog.i(TAG, "Session " + root.sessionId() + " is marked failed due to " + + "rollback session: " + session.sessionId()); + } else if (stagedSession.sessionContains( + s -> s.getPackageName().equals(packageName))) { + // New session cannot have same package name as one of the active sessions + throw new PackageManagerException( + SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, + "Package: " + session.getPackageName() + " in session: " + + session.sessionId() + + " has been staged already by session: " + + stagedSession.sessionId(), null); } // Staging multiple root sessions is not allowed if device doesn't support |