From ae5a219b955d63cbfcc15465d145a9303aafb807 Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Tue, 15 Jun 2021 11:44:23 -0700 Subject: [PATCH] Validate the ServiceRecord state while handling misbehaving FGS Fix a race condition where the previous misbehaving FGS's notifcation is being posted, but that FGS's being stopped, and meanwhile a new FGS is coming up, the system would get confused and results in IllegalStateException. Bug: 182160371 Test: atest CtsAppTestCases:ServiceTest Change-Id: If18e1d7ba88aef693349b82dc6e70f7d98c68665 Merged-In: If18e1d7ba88aef693349b82dc6e70f7d98c68665 --- .../java/com/android/server/am/ActiveServices.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 1062e141060f2..5abb87cedc717 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -935,7 +935,18 @@ public final class ActiveServices { void killMisbehavingService(ServiceRecord r, int appUid, int appPid, String localPackageName) { synchronized (mAm) { - stopServiceLocked(r); + if (!r.destroying) { + // This service is still alive, stop it. + stopServiceLocked(r); + } else { + // Check if there is another instance of it being started in parallel, + // if so, stop that too to avoid spamming the system. + final ServiceMap smap = getServiceMapLocked(r.userId); + final ServiceRecord found = smap.mServicesByInstanceName.remove(r.instanceName); + if (found != null) { + stopServiceLocked(found); + } + } mAm.crashApplication(appUid, appPid, localPackageName, -1, "Bad notification for startForeground", true /*force*/); }