Skip to content

Commit 7138614

Browse files
committed
binder: Fix potential deadlock in BinderClientTransport.notifyTerminated()
Move future cancellation to offloadExecutor to avoid deadlock when AsyncSecurityPolicy uses directExecutor() for callbacks. Fixes #12190 Signed-off-by: Hyunsang Han <gustkd3@gmail.com>
1 parent 9111970 commit 7138614

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -316,14 +316,21 @@ void notifyTerminated() {
316316
readyTimeoutFuture.cancel(false);
317317
readyTimeoutFuture = null;
318318
}
319-
if (preAuthResultFuture != null) {
320-
preAuthResultFuture.cancel(false); // No effect if already complete.
321-
}
322-
if (authResultFuture != null) {
323-
authResultFuture.cancel(false); // No effect if already complete.
324-
}
319+
320+
ListenableFuture<Status> preAuthFuture = preAuthResultFuture;
321+
ListenableFuture<Status> authFuture = authResultFuture;
322+
preAuthResultFuture = null;
323+
authResultFuture = null;
324+
325325
serviceBinding.unbind();
326326
clientTransportListener.transportTerminated();
327+
328+
if (preAuthFuture != null) {
329+
offloadExecutor.execute(() -> preAuthFuture.cancel(false)); // No effect if already complete.
330+
}
331+
if (authFuture != null) {
332+
offloadExecutor.execute(() -> authFuture.cancel(false)); // No effect if already complete.
333+
}
327334
}
328335

329336
@Override

0 commit comments

Comments
 (0)