Avoid IndexOutOfBoundsException when accessing RemoteCallbackList

This is not a deep copy so it's the same reference. It is possible a
IndexOutOfBoundsException may happen.

Bug: 29385425
Test: build. Manual, add log to check.
1. Local add code to regiser with user 10 and 11
2. Boot and try to add and remove user or run
3. Check the logs and no exception occurs

Change-Id: I0d0da1cbb391e32ea0876e84960f9c61c4a89dd4
This commit is contained in:
Joanne Chung
2023-07-07 09:18:24 +00:00
parent ac9f62e527
commit 9cd80779e1

View File

@@ -69,16 +69,24 @@ class PackageMonitorCallbackHelper {
}
public void onUserRemoved(int userId) {
RemoteCallbackList<IRemoteCallback> callbacks;
ArrayList<IRemoteCallback> targetUnRegisteredCallbacks = null;
synchronized (mLock) {
callbacks = mCallbacks;
int registerCount = mCallbacks.getRegisteredCallbackCount();
for (int i = 0; i < registerCount; i++) {
int registerUserId = (int) mCallbacks.getRegisteredCallbackCookie(i);
if (registerUserId == userId) {
IRemoteCallback callback = mCallbacks.getRegisteredCallbackItem(i);
if (targetUnRegisteredCallbacks == null) {
targetUnRegisteredCallbacks = new ArrayList<>();
}
targetUnRegisteredCallbacks.add(callback);
}
}
}
int registerCount = callbacks.getRegisteredCallbackCount();
for (int i = 0; i < registerCount; i++) {
int registerUserId = (int) callbacks.getRegisteredCallbackCookie(i);
if (registerUserId == userId) {
IRemoteCallback callback = callbacks.getRegisteredCallbackItem(i);
unregisterPackageMonitorCallback(callback);
if (targetUnRegisteredCallbacks != null && targetUnRegisteredCallbacks.size() > 0) {
int count = targetUnRegisteredCallbacks.size();
for (int i = 0; i < count; i++) {
unregisterPackageMonitorCallback(targetUnRegisteredCallbacks.get(i));
}
}
}