From 82d4acc6ba78b4bd8a8b56bdefa7c4d7993291f0 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Tue, 8 Jan 2019 17:25:48 -0800 Subject: [PATCH] Whitelist intent verifier from broadcast dispatch In rare cases it was possible for the intent filter verifier to fall out of whitelist waiting on broadcast dispatch. We now use the broadcast mechanism's inherent whitelisting capabilities to start that interval at the actual broadcast dispatch time so that queue delays don't impact the verifier's ability to do work. Bug: 119414110 Test: manual Change-Id: If52b97ce6fb3bedb4c16afba254cab3ede153ecd --- .../com/android/server/pm/PackageManagerService.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 8c00380b82b15..400443a16fabf 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -123,6 +123,7 @@ import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.AppDetailsActivity; import android.app.AppOpsManager; +import android.app.BroadcastOptions; import android.app.IActivityManager; import android.app.ResourcesManager; import android.app.admin.IDevicePolicyManager; @@ -1044,12 +1045,17 @@ public class PackageManagerService extends IPackageManager.Stub verificationIntent.setComponent(mIntentFilterVerifierComponent); verificationIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + final long whitelistTimeout = getVerificationTimeout(); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setTemporaryAppWhitelistDuration(whitelistTimeout); + DeviceIdleController.LocalService idleController = getDeviceIdleController(); idleController.addPowerSaveTempWhitelistApp(Process.myUid(), - mIntentFilterVerifierComponent.getPackageName(), getVerificationTimeout(), + mIntentFilterVerifierComponent.getPackageName(), whitelistTimeout, UserHandle.USER_SYSTEM, true, "intent filter verifier"); - mContext.sendBroadcastAsUser(verificationIntent, UserHandle.SYSTEM); + mContext.sendBroadcastAsUser(verificationIntent, UserHandle.SYSTEM, + null, options.toBundle()); if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG, "Sending IntentFilter verification broadcast"); }