This is an automated email from the ASF dual-hosted git repository. johnnyv pushed a commit to branch bugfix/DIRMINA1132 in repository https://gitbox.apache.org/repos/asf/mina.git
The following commit(s) were added to refs/heads/bugfix/DIRMINA1132 by this push: new 94a69ad Fixes possible incorrect assertion of handshaking during write 94a69ad is described below commit 94a69ad8df159eff849ce68e34ffefaf1bb1ddb6 Author: Jonathan Valliere <john...@apache.org> AuthorDate: Sat Jul 24 11:45:35 2021 -0400 Fixes possible incorrect assertion of handshaking during write --- .../org/apache/mina/filter/ssl2/SSL2Filter.java | 10 +-- .../org/apache/mina/filter/ssl2/SSL2Handler.java | 3 + .../org/apache/mina/filter/ssl2/SSL2HandlerG0.java | 80 ++++++++++++---------- .../apache/mina/filter/ssl2/SSL2SimpleTest.java | 16 +++-- 4 files changed, 62 insertions(+), 47 deletions(-) diff --git a/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2Filter.java b/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2Filter.java index 85d43c6..8bd9fa4 100644 --- a/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2Filter.java +++ b/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2Filter.java @@ -34,7 +34,6 @@ import org.apache.mina.core.session.AttributeKey; import org.apache.mina.core.session.IoSession; import org.apache.mina.core.write.WriteRequest; import org.apache.mina.util.BasicThreadFactory; -import org.apache.mina.util.StackInspector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,8 +57,8 @@ public class SSL2Filter extends IoFilterAdapter { */ protected static final Logger LOGGER = LoggerFactory.getLogger(SSL2Filter.class); - protected static final Executor EXECUTOR = new ThreadPoolExecutor(2, 4, 100, TimeUnit.MILLISECONDS, - new LinkedBlockingDeque<Runnable>(), new BasicThreadFactory("ssl-exec")); + protected static final Executor EXECUTOR = new ThreadPoolExecutor(2, 2, 100, TimeUnit.MILLISECONDS, + new LinkedBlockingDeque<Runnable>(), new BasicThreadFactory("ssl-exec", true)); protected static final AttributeKey SSL_HANDLER = new AttributeKey(SSL2Filter.class, "handler"); @@ -195,8 +194,6 @@ public class SSL2Filter extends IoFilterAdapter { LOGGER.debug("session openend {}", session); - StackInspector.get().printStackTrace(); - SSL2Handler x = SSL2Handler.class.cast(session.getAttribute(SSL_HANDLER)); if (x == null) { @@ -238,6 +235,9 @@ public class SSL2Filter extends IoFilterAdapter { @Override public void filterWrite(NextFilter next, IoSession session, WriteRequest writeRequest) throws Exception { + + LOGGER.debug("session write {}", session); + if (writeRequest instanceof EncryptedWriteRequest) { super.filterWrite(next, session, writeRequest); } else { diff --git a/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2Handler.java b/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2Handler.java index 601e73b..1e8e59b 100644 --- a/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2Handler.java +++ b/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2Handler.java @@ -138,6 +138,9 @@ public abstract class SSL2Handler { b.append("server"); } + b.append(", status="); + b.append(this.mEngine.getHandshakeStatus()); + b.append("]"); return b.toString(); diff --git a/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2HandlerG0.java b/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2HandlerG0.java index 700ebdd..86d8d23 100644 --- a/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2HandlerG0.java +++ b/mina-core/src/main/java/org/apache/mina/filter/ssl2/SSL2HandlerG0.java @@ -20,6 +20,11 @@ public class SSL2HandlerG0 extends SSL2Handler { synchronized public void open(final NextFilter next) throws SSLException { if (this.mEngine.getUseClientMode()) { + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("{} open() - begin handshaking", toString()); + } + this.mEngine.beginHandshake(); this.lwrite(next); } @@ -144,50 +149,51 @@ public class SSL2HandlerG0 extends SSL2Handler { result.bytesConsumed(), result.bytesProduced(), result.getStatus(), result.getHandshakeStatus()); } - if (result.getHandshakeStatus() == HandshakeStatus.NOT_HANDSHAKING) { - // then we probably consumed some data - dest.flip(); - if (source.hasRemaining()) { + if (result.bytesProduced() == 0) { + dest.free(); + } else { + if (result.bytesConsumed() == 0) { next.filterWrite(this.mSession, new EncryptedWriteRequest(dest, null)); - lwrite(next, request); // write additional chunks } else { - source.rewind(); - next.filterWrite(this.mSession, new EncryptedWriteRequest(dest, request)); - } + // then we probably consumed some data + dest.flip(); + if (source.hasRemaining()) { + next.filterWrite(this.mSession, new EncryptedWriteRequest(dest, null)); + lwrite(next, request); // write additional chunks + } else { + source.rewind(); + next.filterWrite(this.mSession, new EncryptedWriteRequest(dest, request)); + } - return true; - } else { - if (dest.position() == 0) { - dest.free(); - } else { - next.filterWrite(this.mSession, new EncryptedWriteRequest(dest, null)); + return true; } + } - switch (result.getHandshakeStatus()) { - case NEED_TASK: - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("{} lwrite() - handshake needs task, scheduling tasks", toString()); - } - this.schedule_task(next); - break; - case NEED_WRAP: - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("{} lwrite() - handshake needs to encode a message", toString()); - } - return this.lwrite(next, request); - case FINISHED: - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("{} lwrite() - handshake finished, flushing pending requests", toString()); - } - if (this.lwrite(next, request)) { - this.lflush(next); - return true; - } - break; - } + switch (result.getHandshakeStatus()) { + case NEED_TASK: + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("{} lwrite() - handshake needs task, scheduling tasks", toString()); + } + this.schedule_task(next); + break; + case NEED_WRAP: + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("{} lwrite() - handshake needs to encode a message", toString()); + } + return this.lwrite(next, request); + case FINISHED: + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("{} lwrite() - handshake finished, flushing pending requests", toString()); + } + if (this.lwrite(next, request)) { + this.lflush(next); + return true; + } + break; } return false; + } /** @@ -252,7 +258,7 @@ public class SSL2HandlerG0 extends SSL2Handler { return result.bytesProduced() > 0; } - protected void lflush(final NextFilter next) throws SSLException { + synchronized protected void lflush(final NextFilter next) throws SSLException { if (this.mWriteQueue.isEmpty()) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("{} flush() - no saved messages", toString()); diff --git a/mina-core/src/test/java/org/apache/mina/filter/ssl2/SSL2SimpleTest.java b/mina-core/src/test/java/org/apache/mina/filter/ssl2/SSL2SimpleTest.java index d198459..88e92b5 100644 --- a/mina-core/src/test/java/org/apache/mina/filter/ssl2/SSL2SimpleTest.java +++ b/mina-core/src/test/java/org/apache/mina/filter/ssl2/SSL2SimpleTest.java @@ -70,8 +70,6 @@ public class SSL2SimpleTest { connect_future.awaitUninterruptibly(); final IoSession client_socket = connect_future.getSession(); - - client_socket.write(createWriteRequest()).awaitUninterruptibly(); try { Thread.sleep(1000); @@ -79,7 +77,15 @@ public class SSL2SimpleTest { } - client_socket.closeOnFlush().awaitUninterruptibly(); + client_socket.write(createWriteRequest()); + + try { + Thread.sleep(100); + } catch (InterruptedException e) { + + } + + client_socket.closeNow(); socket_connector.dispose(); @@ -98,7 +104,7 @@ public class SSL2SimpleTest { } } - public static WriteRequest createWriteRequest() { + public static IoBuffer createWriteRequest() { // HTTP request StringBuilder http = new StringBuilder(); http.append("GET / HTTP/1.0\r\n"); @@ -109,6 +115,6 @@ public class SSL2SimpleTest { message.put(http.toString().getBytes()); message.flip(); - return new DefaultWriteRequest(message); + return message; } }