Narrow permission re-granting to specific volume.
When mounting a storage volume after an SDK upgrade, the platform grants install permissions requested by apps. This patch fixes a bug that was causing us to re-grant permissions for all installed apps; we now narrow the granting to just the storage volume of interest. Also fixes a bug where scanning of internal ASECs would bump the VersionInfo of the legacy apps-on-SD volume. There is still a bug here around internal ASECs not being considered for re-grants, but that needs to be fixed in a more invasive CL that creates a separate VersionInfo. In addition, internal ASECs (also known as forward locked apps) have been deprecated for some time. Bug: 24583803 Change-Id: I9115fd484ec083bc10a970f5f612860d5a53e520
This commit is contained in:
@@ -2282,7 +2282,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
|
||||
@@ -8227,8 +8227,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()) {
|
||||
@@ -8297,14 +8303,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12625,6 +12638,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)) {
|
||||
@@ -15501,7 +15526,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 {
|
||||
@@ -15556,7 +15581,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();
|
||||
|
||||
@@ -15628,7 +15654,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) {
|
||||
@@ -15636,7 +15665,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();
|
||||
@@ -15769,7 +15798,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();
|
||||
|
||||
Reference in New Issue
Block a user