From 642b8d4d8f1ecd5612fcde0913cd9d295c6996f6 Mon Sep 17 00:00:00 2001 From: Shunta Sato Date: Tue, 13 Jun 2017 16:16:13 +0900 Subject: [PATCH] Make RankingHelper$Record.groups thread-safe Symptom: System crash is happened due to NPE at RankingHelper.writeXml. Root cause: RankingHelper$Record.groups.values() returned null. Record.groups is an ArrayMap and this is not thread-safe. When multiple clients call NotificationManager#createNotificationChannelGroup and deleteNotificationChannelGroup at a same time, Record.groups is changed by multiple threads simultaneously. As a result, this ArrayMap object gets broken. Solution: Use ConcurrentHashMap instead of ArrayMap. Test: runtest systemui-notification, test app Bug: 62557189 Author: Tetsutoki Shiozawa Change-Id: I2261dbd1ace4915695528595b9d14d68e5bec55d --- .../java/com/android/server/notification/RankingHelper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java index 2c0cc9585e9f2..b3c6ff6578671 100644 --- a/services/core/java/com/android/server/notification/RankingHelper.java +++ b/services/core/java/com/android/server/notification/RankingHelper.java @@ -53,6 +53,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.concurrent.ConcurrentHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -1186,6 +1187,6 @@ public class RankingHelper implements RankingConfig { boolean showBadge = DEFAULT_SHOW_BADGE; ArrayMap channels = new ArrayMap<>(); - ArrayMap groups = new ArrayMap<>(); + Map groups = new ConcurrentHashMap<>(); } }