summaryrefslogtreecommitdiff
path: root/services/java/com/android/server/pm
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2012-06-08 11:01:42 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-06-08 11:01:42 -0700
commit0876ab0ac17518c479e9dffe025884870a586d9c (patch)
tree06c9f837ba6cfc6d538e0c9d7515aafa6accb872 /services/java/com/android/server/pm
parentf2427580732b3651fb97ac4859334718d2260d15 (diff)
parentd0c5f515c05d05c9d24971695337daf9d6ce409c (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.java11
-rw-r--r--services/java/com/android/server/pm/PackageManagerService.java37
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_"