From 03a2c3833d4b872061bf83956191470abe55b241 Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Fri, 24 Apr 2020 10:04:50 -0700 Subject: [PATCH] Proper handling of unrecoverable status. During installation, instead of uninstall, we need to abort. Bug: b/153874006 Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest Change-Id: I10301bfe085cd2c78e264571dc57ea35c3049f49 --- .../server/pm/PackageInstallerSession.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 8e7eaf6e29fa9..330f4b3334df0 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -1488,6 +1488,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } private void onDataLoaderUnrecoverable() { + if (TextUtils.isEmpty(mPackageName)) { + // The package has not been installed. + return; + } final PackageManagerService packageManagerService = mPm; final String packageName = mPackageName; mHandler.post(() -> { @@ -2610,12 +2614,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { case IDataLoaderStatusListener.DATA_LOADER_STOPPED: case IDataLoaderStatusListener.DATA_LOADER_DESTROYED: return; - case IDataLoaderStatusListener.DATA_LOADER_UNRECOVERABLE: - onDataLoaderUnrecoverable(); - return; } if (mDestroyed || mDataLoaderFinished) { + switch (status) { + case IDataLoaderStatusListener.DATA_LOADER_UNRECOVERABLE: + onDataLoaderUnrecoverable(); + return; + } return; } @@ -2678,6 +2684,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } break; } + case IDataLoaderStatusListener.DATA_LOADER_UNRECOVERABLE: + mDataLoaderFinished = true; + onSessionVerificationFailure( + new PackageManagerException(INSTALL_FAILED_MEDIA_UNAVAILABLE, + "DataLoader reported unrecoverable failure.")); + return; } } catch (RemoteException e) { // In case of streaming failure we don't want to fail or commit the session.