commit | 997d0d3913144ce883f0da7d9e0d8d28e25db1fc | [log] [tgz] |
---|---|---|
author | Maciej Żenczykowski <maze@google.com> | Sat Feb 19 22:24:42 2022 +0000 |
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | Sat Feb 19 22:24:42 2022 +0000 |
tree | fcdd993e5cc788a22f270bc3d557bd8eff77836d | |
parent | fa11e8b951d3510daaa5bd182d077ca289b14643 [diff] | |
parent | bf2848380721150c575fe0c00960fdb0191cc6ef [diff] |
Merge "Fix system_server crash while iterating CookieTagMap" am: dd5a31eb2d am: bf28483807 Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1990333 Change-Id: I6da755077fd8a6bebb8209f0d747e0d54b988c48
diff --git a/service-t/src/com/android/server/net/NetworkStatsService.java b/service-t/src/com/android/server/net/NetworkStatsService.java index eeb56d0..b193623 100644 --- a/service-t/src/com/android/server/net/NetworkStatsService.java +++ b/service-t/src/com/android/server/net/NetworkStatsService.java
@@ -1875,7 +1875,13 @@ private void deleteKernelTagData(int uid) { try { 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 { mCookieTagMap.deleteEntry(key); } catch (ErrnoException e) {