Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c93da800 authored by Zim's avatar Zim
Browse files

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
parent 20905ec0
Loading
Loading
Loading
Loading
+27 −27
Original line number Diff line number Diff line
@@ -4497,6 +4497,8 @@ class StorageManagerService extends IStorageManager.Stub
        }

        public void onAppOpsChanged(int code, int uid, @Nullable String packageName, int mode) {
            final long token = Binder.clearCallingIdentity();
            try {
                if (mIsFuseEnabled) {
                    // When using FUSE, we may need to kill the app if the op changes
                    switch(code) {
@@ -4507,10 +4509,10 @@ class StorageManagerService extends IStorageManager.Stub
                        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.
                                // 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;
@@ -4523,17 +4525,15 @@ class StorageManagerService extends IStorageManager.Stub
                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 {
                    final UserManagerInternal userManagerInternal =
                            LocalServices.getService(UserManagerInternal.class);
                    if (userManagerInternal.isUserInitialized(UserHandle.getUserId(uid))) {
                        onExternalStoragePolicyChanged(uid, packageName);
                    }
                }
            } finally {
                Binder.restoreCallingIdentity(token);
            }
        }
    }
}
}