diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index a71f7d2c64554..6c72a9a1c0c2d 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -1222,7 +1222,7 @@ public class PackageInstaller { try { mSession.addChildSessionId(sessionId); } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + e.rethrowFromSystemServer(); } } @@ -1236,7 +1236,7 @@ public class PackageInstaller { try { mSession.removeChildSessionId(sessionId); } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + e.rethrowFromSystemServer(); } } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index a935c652be53e..74fb4b27100e2 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -841,6 +841,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { @Override public void commit(@NonNull IntentSender statusReceiver, boolean forTransfer) { + if (hasParentSessionId()) { + throw new IllegalStateException( + "Session " + sessionId + " is a child of multi-package session " + + mParentSessionId + " and may not be committed directly."); + } if (!markAsCommitted(statusReceiver, forTransfer)) { return; } @@ -2037,6 +2042,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { @Override public void abandon() { + if (hasParentSessionId()) { + throw new IllegalStateException( + "Session " + sessionId + " is a child of multi-package session " + + mParentSessionId + " and may not be abandoned directly."); + } synchronized (mLock) { assertCallerIsOwnerOrRootLocked(); @@ -2079,13 +2089,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } @Override - public void addChildSessionId(int childSessionId) throws RemoteException { + public void addChildSessionId(int childSessionId) { final PackageInstallerSession childSession = mSessionProvider.getSession(childSessionId); - if (childSession == null) { - throw new RemoteException("Unable to add child.", - new PackageManagerException("Child session " + childSessionId - + " does not exist"), - false, true).rethrowAsRuntimeException(); + if (childSession == null + || (childSession.hasParentSessionId() && childSession.mParentSessionId != sessionId) + || childSession.mCommitted + || childSession.mDestroyed) { + throw new IllegalStateException("Unable to add child session " + childSessionId + + " as it does not exist or is in an invalid state."); } synchronized (mLock) { assertCallerIsOwnerOrRootLocked(); @@ -2124,11 +2135,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { synchronized (mLock) { if (parentSessionId != SessionInfo.INVALID_ID && mParentSessionId != SessionInfo.INVALID_ID) { - throw new RemoteException("Unable to set parent session.", - new PackageManagerException( - "The parent of " + sessionId + " is" + " already set to " - + mParentSessionId), false, - true).rethrowAsRuntimeException(); + throw new IllegalStateException("The parent of " + sessionId + " is" + " already" + + "set to " + mParentSessionId); } this.mParentSessionId = parentSessionId; } diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 1908b3f8b3661..72d543862c589 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -487,7 +487,7 @@ public class StagingManager { } try { apkParentSession.addChildSessionId(apkChildSession.sessionId); - } catch (RemoteException e) { + } catch (IllegalStateException e) { Slog.e(TAG, "Failed to add a child session for installing the APK files", e); return false; }