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 <[email protected]>
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;
}
}