From 119aff932429e5a292608fb43fc034767aa940eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Cogolu=C3=A8gnes?= Date: Thu, 29 Jul 2021 16:19:14 +0200 Subject: [PATCH] Keep reading from network on TLS buffer underflow Fixes #700 --- .../client/impl/nio/SslEngineFrameBuilder.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/rabbitmq/client/impl/nio/SslEngineFrameBuilder.java b/src/main/java/com/rabbitmq/client/impl/nio/SslEngineFrameBuilder.java index c2f1923874..e96b2d7e8c 100644 --- a/src/main/java/com/rabbitmq/client/impl/nio/SslEngineFrameBuilder.java +++ b/src/main/java/com/rabbitmq/client/impl/nio/SslEngineFrameBuilder.java @@ -32,6 +32,8 @@ public class SslEngineFrameBuilder extends FrameBuilder { private final ByteBuffer cipherBuffer; + private boolean needToReadMore = false; + public SslEngineFrameBuilder(SSLEngine sslEngine, ByteBuffer plainIn, ByteBuffer cipherIn, ReadableByteChannel channel) { super(channel, plainIn); this.sslEngine = sslEngine; @@ -40,11 +42,21 @@ public SslEngineFrameBuilder(SSLEngine sslEngine, ByteBuffer plainIn, ByteBuffer @Override protected boolean somethingToRead() throws IOException { - if (applicationBuffer.hasRemaining()) { + if (applicationBuffer.hasRemaining() && !needToReadMore) { return true; } else { applicationBuffer.clear(); + if (needToReadMore) { + int read = NioHelper.read(channel, cipherBuffer); + if (read == 0) { + return false; + } else { + this.needToReadMore = false; + this.cipherBuffer.flip(); + } + } + while (true) { SSLEngineResult result = sslEngine.unwrap(cipherBuffer, applicationBuffer); switch (result.getStatus()) { @@ -61,6 +73,7 @@ protected boolean somethingToRead() throws IOException { cipherBuffer.compact(); int read = NioHelper.read(channel, cipherBuffer); if (read == 0) { + this.needToReadMore = true; return false; } cipherBuffer.flip();