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;
        }
 }

Reply via email to