Fix for client tracking on bind to service.

We were not correctly updating the bound client UIDs when binding to a
service with an already-running process. This could result in a
background activity start by the app hosting the service being
incorrectly blocked.

(Also includes a drive-by fix of a potential NPE.)

Bug: 131468397
Test: Manually verified YouTube VR problem is fixed.
Test: atest BackgroundActivityLaunchTest
Test: atest RootWindowContainerTests
Test: atest WmTests:ActivityStarterTests
Test: atest CtsWindowManagerDeviceTestCases:ActivityStarterTests
Test: atest CtsAppTestCases:.ServiceTest
Change-Id: I153cf3678f10439075af39a8bd88ff8d492e1ffe
This commit is contained in:
Alan Stokes
2019-04-29 13:51:18 +01:00
parent 7abba0a4bc
commit 8473a2c103
3 changed files with 16 additions and 20 deletions

View File

@@ -1768,12 +1768,7 @@ public final class ActiveServices {
callerApp.uid, callerApp.processName, callingPackage);
IBinder binder = connection.asBinder();
ArrayList<ConnectionRecord> clist = s.getConnections().get(binder);
if (clist == null) {
clist = new ArrayList<ConnectionRecord>();
s.putConnection(binder, clist);
}
clist.add(c);
s.addConnection(binder, c);
b.connections.add(c);
if (activity != null) {
activity.addConnection(c);
@@ -1792,9 +1787,9 @@ public final class ActiveServices {
if (s.app != null) {
updateServiceClientActivitiesLocked(s.app, c, true);
}
clist = mServiceConnections.get(binder);
ArrayList<ConnectionRecord> clist = mServiceConnections.get(binder);
if (clist == null) {
clist = new ArrayList<ConnectionRecord>();
clist = new ArrayList<>();
mServiceConnections.put(binder, clist);
}
clist.add(c);
@@ -3828,8 +3823,8 @@ public final class ActiveServices {
public PendingIntent getRunningServiceControlPanelLocked(ComponentName name) {
int userId = UserHandle.getUserId(Binder.getCallingUid());
ServiceRecord r = getServiceByNameLocked(name, userId);
ArrayMap<IBinder, ArrayList<ConnectionRecord>> connections = r.getConnections();
if (r != null) {
ArrayMap<IBinder, ArrayList<ConnectionRecord>> connections = r.getConnections();
for (int conni = connections.size() - 1; conni >= 0; conni--) {
ArrayList<ConnectionRecord> conn = connections.valueAt(conni);
for (int i=0; i<conn.size(); i++) {

View File

@@ -1186,8 +1186,8 @@ class ProcessRecord implements WindowProcessListener {
!mAllowBackgroundActivityStartsTokens.isEmpty());
}
void addBoundClientUids(ArraySet<Integer> clientUids) {
mBoundClientUids.addAll(clientUids);
void addBoundClientUid(int clientUid) {
mBoundClientUids.add(clientUid);
mWindowProcessController.setBoundClientUids(mBoundClientUids);
}

View File

@@ -38,7 +38,6 @@ import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
@@ -580,15 +579,17 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
return connections;
}
void putConnection(IBinder binder, ArrayList<ConnectionRecord> clist) {
connections.put(binder, clist);
// if we have a process attached, add bound client uids of this connection to it
void addConnection(IBinder binder, ConnectionRecord c) {
ArrayList<ConnectionRecord> clist = connections.get(binder);
if (clist == null) {
clist = new ArrayList<>();
connections.put(binder, clist);
}
clist.add(c);
// if we have a process attached, add bound client uid of this connection to it
if (app != null) {
ArraySet<Integer> boundClientUids = new ArraySet<>();
for (int i = 0; i < clist.size(); i++) {
boundClientUids.add(clist.get(i).clientUid);
}
app.addBoundClientUids(boundClientUids);
app.addBoundClientUid(c.clientUid);
}
}