From e6620b2d993a8372f63d1c0ca0f1c8be6ab9ad0f Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 22 Jan 2010 14:46:21 -0800 Subject: [PATCH] Fix issue #2391429: Crash during boot if fwd locked app is incompletely installed We need to remove left-over .apk when cleaning up a partially installed app. Change-Id: I94264549670a2ad01622f746c40c82c30dd3da8d --- .../com/android/server/PackageManagerService.java | 29 +++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 93821464c243..86504a095daf 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -573,7 +573,7 @@ class PackageManagerService extends IPackageManager.Stub { mAppInstallDir.mkdirs(); // scanDirLI() assumes this dir exists } //look for any incomplete package installations - ArrayList deletePkgsList = mSettings.getListOfIncompleteInstallPackages(); + ArrayList deletePkgsList = mSettings.getListOfIncompleteInstallPackages(); //clean up list for(int i = 0; i < deletePkgsList.size(); i++) { //clean up here @@ -628,20 +628,31 @@ class PackageManagerService extends IPackageManager.Stub { } } - void cleanupInstallFailedPackage(String packageName) { + void cleanupInstallFailedPackage(PackageSetting ps) { + Log.i(TAG, "Cleaning up incompletely installed app: " + ps.name); if (mInstaller != null) { - int retCode = mInstaller.remove(packageName); + int retCode = mInstaller.remove(ps.name); if (retCode < 0) { Log.w(TAG, "Couldn't remove app data directory for package: " - + packageName + ", retcode=" + retCode); + + ps.name + ", retcode=" + retCode); } } else { //for emulator - PackageParser.Package pkg = mPackages.get(packageName); + PackageParser.Package pkg = mPackages.get(ps.name); File dataDir = new File(pkg.applicationInfo.dataDir); dataDir.delete(); } - mSettings.removePackageLP(packageName); + if (ps.codePath != null) { + if (!ps.codePath.delete()) { + Log.w(TAG, "Unable to remove old code file: " + ps.codePath); + } + } + if (ps.resourcePath != null) { + if (!ps.resourcePath.delete() && !ps.resourcePath.equals(ps.codePath)) { + Log.w(TAG, "Unable to remove old code file: " + ps.resourcePath); + } + } + mSettings.removePackageLP(ps.name); } void readPermissions() { @@ -6732,15 +6743,15 @@ class PackageManagerService extends IPackageManager.Stub { return mReadMessages.toString(); } - ArrayList getListOfIncompleteInstallPackages() { + ArrayList getListOfIncompleteInstallPackages() { HashSet kList = new HashSet(mPackages.keySet()); Iterator its = kList.iterator(); - ArrayList ret = new ArrayList(); + ArrayList ret = new ArrayList(); while(its.hasNext()) { String key = its.next(); PackageSetting ps = mPackages.get(key); if(ps.getInstallStatus() == PKG_INSTALL_INCOMPLETE) { - ret.add(key); + ret.add(ps); } } return ret; -- 2.11.0