Skip to content

Commit c54cfff

Browse files
committed
binder: Avoid potential deadlock when canceling AsyncSecurityPolicy futures
Move future cancellation outside of synchronized block in BinderClientTransport.notifyTerminated() to prevent deadlock if AsyncSecurityPolicy uses directExecutor() for callbacks. Fixes #12190
1 parent 95d16d8 commit c54cfff

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

binder/src/main/java/io/grpc/binder/internal/BinderTransport.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -813,14 +813,21 @@ void notifyTerminated() {
813813
readyTimeoutFuture.cancel(false);
814814
readyTimeoutFuture = null;
815815
}
816-
if (preAuthResultFuture != null) {
817-
preAuthResultFuture.cancel(false); // No effect if already complete.
818-
}
819-
if (authResultFuture != null) {
820-
authResultFuture.cancel(false); // No effect if already complete.
821-
}
816+
817+
ListenableFuture<Status> preAuthFuture = preAuthResultFuture;
818+
ListenableFuture<Status> authFuture = authResultFuture;
819+
preAuthResultFuture = null;
820+
authResultFuture = null;
821+
822822
serviceBinding.unbind();
823823
clientTransportListener.transportTerminated();
824+
825+
if (preAuthFuture != null) {
826+
preAuthFuture.cancel(false); // No effect if already complete.
827+
}
828+
if (authFuture != null) {
829+
authFuture.cancel(false); // No effect if already complete.
830+
}
824831
}
825832

826833
@Override

0 commit comments

Comments
 (0)