From f488724013a026a1c2f49ef03f2ecd23571ceae2 Mon Sep 17 00:00:00 2001 From: Martijn Coenen Date: Sun, 24 May 2020 21:36:16 +0200 Subject: [PATCH] Don't kill apps for OP_REQUEST_INSTALL_PACKAGES on targetSdk < 26. The app-op wasn't required back then, and granting it shouldn't change the filesystem view. Bug: 150819885 Test: atest CtsNoPermissiontestCases25 (still fails, but for a different reason now). Change-Id: Id505013233c44ad624d3a4b929bbd3c36ecfd8ce --- .../android/server/StorageManagerService.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index ee0f71b9e9824..b48b303af2a63 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -83,6 +83,7 @@ import android.content.res.ObbInfo; import android.database.ContentObserver; import android.net.Uri; import android.os.Binder; +import android.os.Build; import android.os.DropBoxManager; import android.os.Environment; import android.os.Handler; @@ -4662,6 +4663,10 @@ class StorageManagerService extends IStorageManager.Stub } public void onAppOpsChanged(int code, int uid, @Nullable String packageName, int mode) { + if (packageName == null) { + // This happens :( + return; + } final long token = Binder.clearCallingIdentity(); try { if (mIsFuseEnabled) { @@ -4669,7 +4674,20 @@ class StorageManagerService extends IStorageManager.Stub switch(code) { case OP_REQUEST_INSTALL_PACKAGES: // Always kill regardless of op change, to remount apps /storage - killAppForOpChange(code, uid, packageName); + try { + ApplicationInfo ai = mIPackageManager.getApplicationInfo( + packageName, + 0, UserHandle.getUserId(uid)); + if (ai.targetSdkVersion >= Build.VERSION_CODES.O) { + killAppForOpChange(code, uid, packageName); + } else { + // Apps targeting <26 didn't need this app op to install + // packages - they only need the manifest permission, instead. + // So, there's also no need to kill them. + } + } catch (RemoteException e) { + // Ignore, this is an in-process call + } return; case OP_MANAGE_EXTERNAL_STORAGE: if (mode != MODE_ALLOWED) {