diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 49 | 
1 files changed, 39 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index aa27afafa2f1..045eca6893a9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2285,7 +2285,7 @@ public class PackageManagerService extends IPackageManager.Stub {                          + mSdkVersion + "; regranting permissions for internal storage");                  updateFlags |= UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL;              } -            updatePermissionsLPw(null, null, updateFlags); +            updatePermissionsLPw(null, null, StorageManager.UUID_PRIVATE_INTERNAL, updateFlags);              ver.sdkVersion = mSdkVersion;              // If this is the first boot or an update from pre-M, and it is a normal @@ -8230,8 +8230,14 @@ public class PackageManagerService extends IPackageManager.Stub {      static final int UPDATE_PERMISSIONS_REPLACE_PKG = 1<<1;      static final int UPDATE_PERMISSIONS_REPLACE_ALL = 1<<2; +    private void updatePermissionsLPw(String changingPkg, PackageParser.Package pkgInfo, +            int flags) { +        final String volumeUuid = (pkgInfo != null) ? getVolumeUuidForPackage(pkgInfo) : null; +        updatePermissionsLPw(changingPkg, pkgInfo, volumeUuid, flags); +    } +      private void updatePermissionsLPw(String changingPkg, -            PackageParser.Package pkgInfo, int flags) { +            PackageParser.Package pkgInfo, String replaceVolumeUuid, int flags) {          // Make sure there are no dangling permission trees.          Iterator<BasePermission> it = mSettings.mPermissionTrees.values().iterator();          while (it.hasNext()) { @@ -8300,14 +8306,21 @@ public class PackageManagerService extends IPackageManager.Stub {          if ((flags&UPDATE_PERMISSIONS_ALL) != 0) {              for (PackageParser.Package pkg : mPackages.values()) {                  if (pkg != pkgInfo) { -                    grantPermissionsLPw(pkg, (flags&UPDATE_PERMISSIONS_REPLACE_ALL) != 0, -                            changingPkg); +                    // Only replace for packages on requested volume +                    final String volumeUuid = getVolumeUuidForPackage(pkg); +                    final boolean replace = ((flags & UPDATE_PERMISSIONS_REPLACE_ALL) != 0) +                            && Objects.equals(replaceVolumeUuid, volumeUuid); +                    grantPermissionsLPw(pkg, replace, changingPkg);                  }              }          }          if (pkgInfo != null) { -            grantPermissionsLPw(pkgInfo, (flags&UPDATE_PERMISSIONS_REPLACE_PKG) != 0, changingPkg); +            // Only replace for packages on requested volume +            final String volumeUuid = getVolumeUuidForPackage(pkgInfo); +            final boolean replace = ((flags & UPDATE_PERMISSIONS_REPLACE_PKG) != 0) +                    && Objects.equals(replaceVolumeUuid, volumeUuid); +            grantPermissionsLPw(pkgInfo, replace, changingPkg);          }      } @@ -12628,6 +12641,18 @@ public class PackageManagerService extends IPackageManager.Stub {          return installFlags;      } +    private String getVolumeUuidForPackage(PackageParser.Package pkg) { +        if (isExternal(pkg)) { +            if (TextUtils.isEmpty(pkg.volumeUuid)) { +                return StorageManager.UUID_PRIMARY_PHYSICAL; +            } else { +                return pkg.volumeUuid; +            } +        } else { +            return StorageManager.UUID_PRIVATE_INTERNAL; +        } +    } +      private VersionInfo getSettingsVersionForPackage(PackageParser.Package pkg) {          if (isExternal(pkg)) {              if (TextUtils.isEmpty(pkg.volumeUuid)) { @@ -15504,7 +15529,7 @@ public class PackageManagerService extends IPackageManager.Stub {          if (isMounted) {              if (DEBUG_SD_INSTALL)                  Log.i(TAG, "Loading packages"); -            loadMediaPackages(processCids, uidArr); +            loadMediaPackages(processCids, uidArr, externalStorage);              startCleaningPackages();              mInstallerService.onSecureContainersAvailable();          } else { @@ -15559,7 +15584,8 @@ public class PackageManagerService extends IPackageManager.Stub {       * the cid is added to list of removeCids. We currently don't delete stale       * containers.       */ -    private void loadMediaPackages(ArrayMap<AsecInstallArgs, String> processCids, int[] uidArr) { +    private void loadMediaPackages(ArrayMap<AsecInstallArgs, String> processCids, int[] uidArr, +            boolean externalStorage) {          ArrayList<String> pkgList = new ArrayList<String>();          Set<AsecInstallArgs> keys = processCids.keySet(); @@ -15631,7 +15657,10 @@ public class PackageManagerService extends IPackageManager.Stub {              // cases get permissions that the user didn't initially explicitly              // allow... it would be nice to have some better way to handle              // this situation. -            final VersionInfo ver = mSettings.getExternalVersion(); +            final VersionInfo ver = externalStorage ? mSettings.getExternalVersion() +                    : mSettings.getInternalVersion(); +            final String volumeUuid = externalStorage ? StorageManager.UUID_PRIMARY_PHYSICAL +                    : StorageManager.UUID_PRIVATE_INTERNAL;              int updateFlags = UPDATE_PERMISSIONS_ALL;              if (ver.sdkVersion != mSdkVersion) { @@ -15639,7 +15668,7 @@ public class PackageManagerService extends IPackageManager.Stub {                          + mSdkVersion + "; regranting permissions for external");                  updateFlags |= UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL;              } -            updatePermissionsLPw(null, null, updateFlags); +            updatePermissionsLPw(null, null, volumeUuid, updateFlags);              // Yay, everything is now upgraded              ver.forceCurrent(); @@ -15772,7 +15801,7 @@ public class PackageManagerService extends IPackageManager.Stub {                          + mSdkVersion + "; regranting permissions for " + vol.fsUuid);                  updateFlags |= UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL;              } -            updatePermissionsLPw(null, null, updateFlags); +            updatePermissionsLPw(null, null, vol.fsUuid, updateFlags);              // Yay, everything is now upgraded              ver.forceCurrent();  |