From 11a19e4c715cb6a7fbbfd001a59a743c6e18384c Mon Sep 17 00:00:00 2001 From: ot903277 Date: Wed, 29 Jun 2022 16:15:19 +0800 Subject: [PATCH] Fix weak global reference overflow When the last item of sRunningAttributionSources is removed, the current check condition will cause the process of removing sRunningAttributionSources stopped and return directly, bring in weak global reference table overflow. Change the order for smooth removal. Bug: 218794347 Test: run audio stress test pass Change-Id: I39072f3b72f0be6d6debbcbc948d7a940ad92785 --- .../pm/permission/PermissionManagerService.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 290f4aea498e6..336c27d98ee11 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -5689,16 +5689,21 @@ public class PermissionManagerService extends IPermissionManager.Stub { appOpsManager.finishProxyOp(AppOpsManager.opToPublicName(op), resolvedAttributionSource, skipCurrentFinish); } - - if (next == null || next.getNext() == null) { - return; - } - RegisteredAttribution registered = sRunningAttributionSources.remove(current.getToken()); if (registered != null) { registered.unregister(); } + + if (next == null || next.getNext() == null) { + if (next != null) { + registered = sRunningAttributionSources.remove(next.getToken()); + if (registered != null) { + registered.unregister(); + } + } + return; + } current = next; } }