diff options
| author | Dianne Hackborn <hackbod@google.com> | 2012-06-08 11:01:42 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-06-08 11:01:42 -0700 |
| commit | 0876ab0ac17518c479e9dffe025884870a586d9c (patch) | |
| tree | 06c9f837ba6cfc6d538e0c9d7515aafa6accb872 /services/java/com/android/server/pm | |
| parent | f2427580732b3651fb97ac4859334718d2260d15 (diff) | |
| parent | d0c5f515c05d05c9d24971695337daf9d6ce409c (diff) | |
Merge "Fix issue #6295373: "Package com.google.android.apps.authenticator2 has..." into jb-dev
Diffstat (limited to 'services/java/com/android/server/pm')
| -rw-r--r-- | services/java/com/android/server/pm/Installer.java | 11 | ||||
| -rw-r--r-- | services/java/com/android/server/pm/PackageManagerService.java | 37 |
2 files changed, 42 insertions, 6 deletions
diff --git a/services/java/com/android/server/pm/Installer.java b/services/java/com/android/server/pm/Installer.java index 9b1973e2825a..48004bbf4151 100644 --- a/services/java/com/android/server/pm/Installer.java +++ b/services/java/com/android/server/pm/Installer.java @@ -243,6 +243,17 @@ class Installer { return execute(builder.toString()); } + public int fixUid(String name, int uid, int gid) { + StringBuilder builder = new StringBuilder("fixuid"); + builder.append(' '); + builder.append(name); + builder.append(' '); + builder.append(uid); + builder.append(' '); + builder.append(gid); + return execute(builder.toString()); + } + public int deleteCacheFiles(String name) { StringBuilder builder = new StringBuilder("rmcache"); builder.append(' '); diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 100d8caf9764..49d2ebd8e986 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -191,6 +191,7 @@ public class PackageManagerService extends IPackageManager.Stub { static final int SCAN_NO_PATHS = 1<<5; static final int SCAN_UPDATE_TIME = 1<<6; static final int SCAN_DEFER_DEX = 1<<7; + static final int SCAN_BOOTING = 1<<8; static final int REMOVE_CHATTY = 1<<16; @@ -924,7 +925,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Set flag to monitor and not change apk file paths when // scanning install directories. - int scanMode = SCAN_MONITOR | SCAN_NO_PATHS | SCAN_DEFER_DEX; + int scanMode = SCAN_MONITOR | SCAN_NO_PATHS | SCAN_DEFER_DEX | SCAN_BOOTING; if (mNoDexOpt) { Slog.w(TAG, "Running ENG build: no pre-dexopt!"); scanMode |= SCAN_NO_DEX; @@ -3750,17 +3751,34 @@ public class PackageManagerService extends IPackageManager.Stub { } else { // This is a normal package, need to make its data directory. dataPath = getDataPathForPackage(pkg.packageName, 0); - + boolean uidError = false; - + if (dataPath.exists()) { + // XXX should really do this check for each user. mOutPermissions[1] = 0; FileUtils.getPermissions(dataPath.getPath(), mOutPermissions); // If we have mismatched owners for the data path, we have a problem. if (mOutPermissions[1] != pkg.applicationInfo.uid) { boolean recovered = false; - if ((parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0) { + if (mOutPermissions[1] == 0) { + // The directory somehow became owned by root. Wow. + // This is probably because the system was stopped while + // installd was in the middle of messing with its libs + // directory. Ask installd to fix that. + int ret = mInstaller.fixUid(pkgName, pkg.applicationInfo.uid, + pkg.applicationInfo.uid); + if (ret >= 0) { + recovered = true; + String msg = "Package " + pkg.packageName + + " unexpectedly changed to uid 0; recovered to " + + + pkg.applicationInfo.uid; + reportSettingsProblem(Log.WARN, msg); + } + } + if (!recovered && ((parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0 + || (scanMode&SCAN_BOOTING) != 0)) { // If this is a system app, we can at least delete its // current data so the application will still work. int ret = mInstaller.remove(pkgName, 0); @@ -3769,7 +3787,9 @@ public class PackageManagerService extends IPackageManager.Stub { // Remove the data directories for all users sUserManager.removePackageForAllUsers(pkgName); // Old data gone! - String msg = "System package " + pkg.packageName + String prefix = (parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0 + ? "System package " : "Third party package "; + String msg = prefix + pkg.packageName + " has changed from uid: " + mOutPermissions[1] + " to " + pkg.applicationInfo.uid + "; old data erased"; @@ -3781,7 +3801,7 @@ public class PackageManagerService extends IPackageManager.Stub { pkg.applicationInfo.uid); if (ret == -1) { // Ack should not happen! - msg = "System package " + pkg.packageName + msg = prefix + pkg.packageName + " could not have data directory re-created after delete."; reportSettingsProblem(Log.WARN, msg); mLastScanError = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE; @@ -3794,6 +3814,11 @@ public class PackageManagerService extends IPackageManager.Stub { if (!recovered) { mHasSystemUidErrors = true; } + } else if (!recovered) { + // If we allow this install to proceed, we will be broken. + // Abort, abort! + mLastScanError = PackageManager.INSTALL_FAILED_UID_CHANGED; + return null; } if (!recovered) { pkg.applicationInfo.dataDir = "/mismatched_uid/settings_" |
