Clear calling identity in StorageManagerService#onAppopsChanged

It turns out StorageManagerService#onAppopsChanged runs with the
calling identity of the app setting the uid.

We should run with system_server calling identity before calling into
ActivityManagerService to kill an app when appops changed

Test: PackageInstaller doesn't get killed
Bug: 149895648
Change-Id: I584b1ee340203d8653941fe325ff9bb01ec04ab6
This commit is contained in:
Zim
2020-02-28 19:01:49 +00:00
parent 20905ec041
commit c93da80012

View File

@@ -4497,42 +4497,42 @@ class StorageManagerService extends IStorageManager.Stub
}
public void onAppOpsChanged(int code, int uid, @Nullable String packageName, int mode) {
if (mIsFuseEnabled) {
// When using FUSE, we may need to kill the app if the op changes
switch(code) {
case OP_REQUEST_INSTALL_PACKAGES:
// Always kill regardless of op change, to remount apps /storage
killAppForOpChange(code, uid, packageName);
return;
case OP_MANAGE_EXTERNAL_STORAGE:
if (mode != MODE_ALLOWED) {
// Only kill if op is denied, to lose external_storage gid
// Killing when op is granted to pickup the gid automatically, results
// in a bad UX, especially since the gid only gives access to unreliable
// volumes, USB OTGs that are rarely mounted. The app will get the
// external_storage gid on next organic restart.
final long token = Binder.clearCallingIdentity();
try {
if (mIsFuseEnabled) {
// When using FUSE, we may need to kill the app if the op changes
switch(code) {
case OP_REQUEST_INSTALL_PACKAGES:
// Always kill regardless of op change, to remount apps /storage
killAppForOpChange(code, uid, packageName);
}
return;
case OP_LEGACY_STORAGE:
updateLegacyStorageApps(packageName, uid, mode == MODE_ALLOWED);
return;
return;
case OP_MANAGE_EXTERNAL_STORAGE:
if (mode != MODE_ALLOWED) {
// Only kill if op is denied, to lose external_storage gid
// Killing when op is granted to pickup the gid automatically,
// results in a bad UX, especially since the gid only gives access
// to unreliable volumes, USB OTGs that are rarely mounted. The app
// will get the external_storage gid on next organic restart.
killAppForOpChange(code, uid, packageName);
}
return;
case OP_LEGACY_STORAGE:
updateLegacyStorageApps(packageName, uid, mode == MODE_ALLOWED);
return;
}
}
}
if (mode == MODE_ALLOWED && (code == OP_READ_EXTERNAL_STORAGE
|| code == OP_WRITE_EXTERNAL_STORAGE
|| code == OP_REQUEST_INSTALL_PACKAGES)) {
final long token = Binder.clearCallingIdentity();
try {
if (mode == MODE_ALLOWED && (code == OP_READ_EXTERNAL_STORAGE
|| code == OP_WRITE_EXTERNAL_STORAGE
|| code == OP_REQUEST_INSTALL_PACKAGES)) {
final UserManagerInternal userManagerInternal =
LocalServices.getService(UserManagerInternal.class);
if (userManagerInternal.isUserInitialized(UserHandle.getUserId(uid))) {
onExternalStoragePolicyChanged(uid, packageName);
}
} finally {
Binder.restoreCallingIdentity(token);
}
} finally {
Binder.restoreCallingIdentity(token);
}
}
}