Fix system_server crash while iterating CookieTagMap

When uid is removed, NetworkStatsService will iterate CookieTagMap and
delete the corresponded uid socketTag value. But not only
NetworkStatsService would detete CookieTagMap entries. There are other
threads may also delete CookieTagMap entries such as #unTagSocket in
bpfHandler and desctroy socket listener in TrafficController. System
server crash as NPE because the CookieTagMap entry it iterate just be
removed by other threads at the same time. This is just a simple fix to
prevent the crash. Will have follow up CL for formal fix.

Bug: 220084230
Test: m
Change-Id: I08cad87f537fb09499faf1ff5cfd443fcb8ce436
This commit is contained in:
markchien
2022-02-18 12:48:02 +08:00
committed by Maciej Żenczykowski
parent 66c59866c2
commit c4cfd83ad4

View File

@@ -1875,7 +1875,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
private void deleteKernelTagData(int uid) { private void deleteKernelTagData(int uid) {
try { try {
mCookieTagMap.forEach((key, value) -> { mCookieTagMap.forEach((key, value) -> {
if (value.uid == uid) { // If SkDestroyListener deletes the socket tag while this code is running,
// forEach will either restart iteration from the beginning or return null,
// depending on when the deletion happens.
// If it returns null, continue iteration to delete the data and in fact it would
// just iterate from first key because BpfMap#getNextKey would return first key
// if the current key is not exist.
if (value != null && value.uid == uid) {
try { try {
mCookieTagMap.deleteEntry(key); mCookieTagMap.deleteEntry(key);
} catch (ErrnoException e) { } catch (ErrnoException e) {