Fix potential NPE in autofill Session
Test: atest android.widget.cts.CompoundButtonTest#testPerformClick
Test: atest CtsAutoFillServiceTestCases
Fix: 151814848
Change-Id: I22f70ff47b47b92d6093698719022febf7b076d3
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index de31118..9af7cbe 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -311,6 +311,10 @@
*/
private final AssistDataReceiverImpl mAssistReceiver = new AssistDataReceiverImpl();
+ /**
+ * TODO(b/151867668): improve how asynchronous data dependencies are handled, without using
+ * CountDownLatch.
+ */
private final class AssistDataReceiverImpl extends IAssistDataReceiver.Stub {
@GuardedBy("mLock")
@@ -318,7 +322,7 @@
@GuardedBy("mLock")
private FillRequest mPendingFillRequest;
@GuardedBy("mLock")
- private CountDownLatch mCountDownLatch;
+ private CountDownLatch mCountDownLatch = new CountDownLatch(0);
@Nullable Consumer<InlineSuggestionsRequest> newAutofillRequestLocked(
boolean isInlineRequest) {
@@ -327,6 +331,9 @@
mPendingInlineSuggestionsRequest = null;
return isInlineRequest ? (inlineSuggestionsRequest) -> {
synchronized (mLock) {
+ if (mCountDownLatch.getCount() == 0) {
+ return;
+ }
mPendingInlineSuggestionsRequest = inlineSuggestionsRequest;
mCountDownLatch.countDown();
maybeRequestFillLocked();
@@ -335,8 +342,7 @@
}
void maybeRequestFillLocked() {
- if (mCountDownLatch == null || mCountDownLatch.getCount() > 0
- || mPendingFillRequest == null) {
+ if (mCountDownLatch.getCount() > 0 || mPendingFillRequest == null) {
return;
}
if (mPendingInlineSuggestionsRequest != null) {
@@ -347,7 +353,6 @@
mRemoteFillService.onFillRequest(mPendingFillRequest);
mPendingInlineSuggestionsRequest = null;
mPendingFillRequest = null;
- mCountDownLatch = null;
}
@Override
@@ -447,9 +452,15 @@
request = new FillRequest(requestId, contexts, mClientState, flags,
/*inlineSuggestionsRequest=*/null);
- mPendingFillRequest = request;
- mCountDownLatch.countDown();
- maybeRequestFillLocked();
+ if (mCountDownLatch.getCount() > 0) {
+ mPendingFillRequest = request;
+ mCountDownLatch.countDown();
+ maybeRequestFillLocked();
+ } else {
+ // TODO(b/151867668): ideally this case should not happen, but it was
+ // observed, we should figure out why and fix.
+ mRemoteFillService.onFillRequest(request);
+ }
}
if (mActivityToken != null) {