From b5345b5c30be5ff0ce3a65c7af334419f63fa778 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Fri, 26 Nov 2021 15:53:07 +0800 Subject: [PATCH] Fix NPE caused by orphaned child sessions A null session will cause NPE in mSessionCreationComparator. Bug: 207814360 Test: adb shell dumpsys package Change-Id: I15f2848bc40edab2ef09f44a28b2df9e9ad27e78 --- .../server/pm/PackageInstallerService.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 7c8515b5e33e4..4767d3a4c0650 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -1461,8 +1461,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements private TreeMap> mSessionMap; private final Comparator mSessionCreationComparator = - Comparator.comparingLong((PackageInstallerSession sess) -> sess.createdMillis) - .thenComparingInt(sess -> sess.sessionId); + Comparator.comparingLong( + (PackageInstallerSession sess) -> sess != null ? sess.createdMillis : -1) + .thenComparingInt(sess -> sess != null ? sess.sessionId : -1); ParentChildSessionMap() { mSessionMap = new TreeMap<>(mSessionCreationComparator); @@ -1500,10 +1501,12 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements for (Map.Entry> entry : mSessionMap.entrySet()) { PackageInstallerSession parentSession = entry.getKey(); - pw.print(tag + " "); - parentSession.dump(pw); - pw.println(); - pw.increaseIndent(); + if (parentSession != null) { + pw.print(tag + " "); + parentSession.dump(pw); + pw.println(); + pw.increaseIndent(); + } for (PackageInstallerSession childSession : entry.getValue()) { pw.print(tag + " Child ");