From 4bd4f10273cff03e04c5563f7a660a58fb64ee05 Mon Sep 17 00:00:00 2001 From: prat Date: Thu, 8 May 2025 00:57:49 +0530 Subject: [PATCH 1/2] Fix NPE race in NettyResponseFuture.cancel (#2042) --- .../org/asynchttpclient/netty/NettyResponseFuture.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/main/java/org/asynchttpclient/netty/NettyResponseFuture.java b/client/src/main/java/org/asynchttpclient/netty/NettyResponseFuture.java index c5e4a97d0..4897a4490 100755 --- a/client/src/main/java/org/asynchttpclient/netty/NettyResponseFuture.java +++ b/client/src/main/java/org/asynchttpclient/netty/NettyResponseFuture.java @@ -187,10 +187,10 @@ public boolean cancel(boolean force) { return false; } - // cancel could happen before channel was attached - if (channel != null) { - Channels.setDiscard(channel); - Channels.silentlyCloseChannel(channel); + Channel ch = channel; //atomic read, so that it won't end up in TOCTOU + if (ch != null) { + Channels.setDiscard(ch); + Channels.silentlyCloseChannel(ch); } if (ON_THROWABLE_CALLED_FIELD.getAndSet(this, 1) == 0) { From 66806a412247ed9ef8ee7747026e31e336129301 Mon Sep 17 00:00:00 2001 From: prat Date: Fri, 9 May 2025 23:05:47 +0530 Subject: [PATCH 2/2] Marked channel local variable as final (#2042) --- .../java/org/asynchttpclient/netty/NettyResponseFuture.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/main/java/org/asynchttpclient/netty/NettyResponseFuture.java b/client/src/main/java/org/asynchttpclient/netty/NettyResponseFuture.java index 4897a4490..c29c0f33d 100755 --- a/client/src/main/java/org/asynchttpclient/netty/NettyResponseFuture.java +++ b/client/src/main/java/org/asynchttpclient/netty/NettyResponseFuture.java @@ -187,7 +187,7 @@ public boolean cancel(boolean force) { return false; } - Channel ch = channel; //atomic read, so that it won't end up in TOCTOU + final Channel ch = channel; //atomic read, so that it won't end up in TOCTOU if (ch != null) { Channels.setDiscard(ch); Channels.silentlyCloseChannel(ch);