Fix potential NPE in STHelper

We may get stale callbacks for unloaded models, so we should validate
the recognition token after checking the validity of the model data.

Fixes: 281342889
Bug: 281139493
Test: SoundTriggerManagerTest
Change-Id: I77ffea29f43ebf75bcaaaa3332645e71a8c11a36
This commit is contained in:
Atneya Nair
2023-05-06 17:35:35 -07:00
parent 34a070a6ff
commit 8b973fb814

View File

@@ -789,15 +789,15 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
return;
}
ModelData model = getModelDataForLocked(event.soundModelHandle);
if (!Objects.equals(event.getToken(), model.getToken())) {
// Stale event, do nothing
return;
}
if (model == null || !model.isGenericModel()) {
Slog.w(TAG, "Generic recognition event: Model does not exist for handle: "
+ event.soundModelHandle);
return;
}
if (!Objects.equals(event.getToken(), model.getToken())) {
// Stale event, do nothing
return;
}
IRecognitionStatusCallback callback = model.getCallback();
if (callback == null) {
@@ -875,11 +875,11 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
Slog.w(TAG, "Recognition aborted");
MetricsLogger.count(mContext, "sth_recognition_aborted", 1);
ModelData modelData = getModelDataForLocked(event.soundModelHandle);
if (!Objects.equals(event.getToken(), modelData.getToken())) {
// Stale event, do nothing
return;
}
if (modelData != null && modelData.isModelStarted()) {
if (!Objects.equals(event.getToken(), modelData.getToken())) {
// Stale event, do nothing
return;
}
modelData.setStopped();
try {
IRecognitionStatusCallback callback = modelData.getCallback();
@@ -916,16 +916,15 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
MetricsLogger.count(mContext, "sth_keyphrase_recognition_event", 1);
int keyphraseId = getKeyphraseIdFromEvent(event);
ModelData modelData = getKeyphraseModelDataLocked(keyphraseId);
if (!Objects.equals(event.getToken(), modelData.getToken())) {
// Stale event, do nothing
return;
}
if (modelData == null || !modelData.isKeyphraseModel()) {
Slog.e(TAG, "Keyphase model data does not exist for ID:" + keyphraseId);
return;
}
if (!Objects.equals(event.getToken(), modelData.getToken())) {
// Stale event, do nothing
return;
}
if (modelData.getCallback() == null) {
Slog.w(TAG, "Received onRecognition event without callback for keyphrase model.");
return;