Check for secdiscardable file missing

When trying to unlock a synthetic password protector whose
"secdiscardable" file has gone missing, return an error instead of
throwing a NullPointerException that crashes system_server.

Note, this scenario is not supposed to ever happen, and if it does there
is still no way to unlock the protector.  This change is merely a
robustness improvement to avoid unnecessarily crashing system_server,
not a fix for any actual underlying issue.

Bug: 269567270
Change-Id: If80fef0292d98ac3d53f7c4685afcaf742bbff2e
This commit is contained in:
Eric Biggers
2023-02-22 00:28:29 +00:00
parent 1a12606cc7
commit be9e388172

View File

@@ -1245,8 +1245,13 @@ class SyntheticPasswordManager {
}
sid = sidFromPasswordHandle(pwd.passwordHandle);
}
protectorSecret = transformUnderSecdiscardable(stretchedLskf,
loadSecdiscardable(protectorId, userId));
byte[] secdiscardable = loadSecdiscardable(protectorId, userId);
if (secdiscardable == null) {
Slog.e(TAG, "secdiscardable file not found");
result.gkResponse = VerifyCredentialResponse.ERROR;
return result;
}
protectorSecret = transformUnderSecdiscardable(stretchedLskf, secdiscardable);
}
// Supplied credential passes first stage weaver/gatekeeper check so it should be correct.
// Notify the callback so the keyguard UI can proceed immediately.
@@ -1311,6 +1316,11 @@ class SyntheticPasswordManager {
byte[] token, int userId) {
AuthenticationResult result = new AuthenticationResult();
byte[] secdiscardable = loadSecdiscardable(protectorId, userId);
if (secdiscardable == null) {
Slog.e(TAG, "secdiscardable file not found");
result.gkResponse = VerifyCredentialResponse.ERROR;
return result;
}
int slotId = loadWeaverSlot(protectorId, userId);
if (slotId != INVALID_WEAVER_SLOT) {
if (!isWeaverAvailable()) {