From 8f5189dd604c4efe97e9fcd401effba9d18fd41e Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Fri, 24 Feb 2023 05:11:08 +0000 Subject: Load Weaver HAL if needed in destroyWeaverSlot() Now that mWeaver is not initialized at boot time, but rather only by isWeaverAvailable(), we need to make sure that isWeaverAvailable() is called before dereferencing mWeaver. This was done in all cases except for destroyWeaverSlot(), which is reachable with null mWeaver if a user is removed before any user is unlocked. Fix this. This fixes commit 61bd5961f6fc ("Do not initialize the weaver service at boot") (http://ag/21164366). Bug: 252760591 Test: Set a PIN on user 0. Add secondary user. Reboot. Remove secondary user using 'pm remove-user'. system_server crashes before this change, but not after it. Change-Id: I05019af328c56739724a67f9af776664e2cef438 --- .../com/android/server/locksettings/SyntheticPasswordManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java index e592a2207095..d070b416c53c 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java @@ -780,6 +780,10 @@ class SyntheticPasswordManager { int slot = loadWeaverSlot(protectorId, userId); destroyState(WEAVER_SLOT_NAME, protectorId, userId); if (slot != INVALID_WEAVER_SLOT) { + if (!isWeaverAvailable()) { + Slog.e(TAG, "Cannot erase Weaver slot because Weaver is unavailable"); + return; + } Set usedSlots = getUsedWeaverSlots(); if (!usedSlots.contains(slot)) { Slog.i(TAG, "Destroy weaver slot " + slot + " for user " + userId); -- cgit v1.2.3-59-g8ed1b