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
This commit is contained in:
Jing Ji
2021-06-15 11:44:23 -07:00
parent aa9c6c2de6
commit ae5a219b95

View File

@@ -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*/);
}