You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by el...@apache.org on 2022/02/08 00:28:52 UTC
[mina] branch 2.0.X updated: Applied fix for DIRMINA-1107
This is an automated email from the ASF dual-hosted git repository.
elecharny pushed a commit to branch 2.0.X
in repository https://gitbox.apache.org/repos/asf/mina.git
The following commit(s) were added to refs/heads/2.0.X by this push:
new a9da96d Applied fix for DIRMINA-1107
a9da96d is described below
commit a9da96d88ec52511b23bb78990fa3df51c0b2c49
Author: emmanuel lecharny <el...@apache.org>
AuthorDate: Tue Feb 8 01:28:36 2022 +0100
Applied fix for DIRMINA-1107
---
.../java/org/apache/mina/filter/ssl/SslFilter.java | 21 +++++----
.../org/apache/mina/filter/ssl/SslHandler.java | 50 ++++++++--------------
.../org/apache/mina/filter/ssl/SslFilterTest.java | 13 ++++--
3 files changed, 39 insertions(+), 45 deletions(-)
diff --git a/mina-core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java b/mina-core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java
index 83e5bea..b3b88c6 100644
--- a/mina-core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java
+++ b/mina-core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java
@@ -237,9 +237,11 @@ public class SslFilter extends IoFilterAdapter {
} else {
started = false;
}
+
+ sslHandler.flushFilterWrite();
}
- sslHandler.flushScheduledEvents();
+ sslHandler.flushMessageReceived();
} catch (SSLException se) {
sslHandler.release();
throw se;
@@ -336,9 +338,8 @@ public class SslFilter extends IoFilterAdapter {
try {
synchronized (sslHandler) {
future = initiateClosure(nextFilter, session);
+ sslHandler.flushFilterWrite();
}
-
- sslHandler.flushScheduledEvents();
} catch (SSLException se) {
sslHandler.release();
throw se;
@@ -564,7 +565,7 @@ public class SslFilter extends IoFilterAdapter {
}
}
- sslHandler.flushScheduledEvents();
+ sslHandler.flushMessageReceived();
}
@Override
@@ -679,10 +680,10 @@ public class SslFilter extends IoFilterAdapter {
needsFlush = false;
}
}
- }
- if (needsFlush) {
- sslHandler.flushScheduledEvents();
+ if (needsFlush) {
+ sslHandler.flushFilterWrite();
+ }
}
} catch (SSLException se) {
sslHandler.release();
@@ -714,9 +715,10 @@ public class SslFilter extends IoFilterAdapter {
}
});
}
+
+ sslHandler.flushFilterWrite();
}
- sslHandler.flushScheduledEvents();
} catch (SSLException se) {
sslHandler.release();
throw se;
@@ -760,9 +762,10 @@ public class SslFilter extends IoFilterAdapter {
try {
synchronized (sslHandler) {
sslHandler.handshake(nextFilter);
+ sslHandler.flushFilterWrite();
}
- sslHandler.flushScheduledEvents();
+ sslHandler.flushMessageReceived();
} catch (SSLException se) {
sslHandler.release();
throw se;
diff --git a/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java b/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java
index 230e8e9..1eaac9e 100644
--- a/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java
+++ b/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java
@@ -23,8 +23,6 @@ import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.ReentrantLock;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLEngineResult;
@@ -118,12 +116,6 @@ class SslHandler {
* for data being produced during the handshake). */
private boolean writingEncryptedData;
- /** A lock to protect the SSL flush of events */
- private ReentrantLock sslLock = new ReentrantLock();
-
- /** A counter of schedules events */
- private final AtomicInteger scheduledEvents = new AtomicInteger(0);
-
/**
* Create a new SSL Handler, and initialize it.
*
@@ -298,6 +290,18 @@ class SslHandler {
filterWriteEventQueue.add(new IoFilterEvent(nextFilter, IoEventType.WRITE, session, writeRequest));
}
+ /* no qualifier */void flushFilterWrite() {
+ // Fire events only when the lock is available for this handler.
+ IoFilterEvent event;
+
+ // We need synchronization here inevitably because filterWrite can be
+ // called simultaneously and cause 'bad record MAC' integrity error.
+ while ((event = filterWriteEventQueue.poll()) != null) {
+ NextFilter nextFilter = event.getNextFilter();
+ nextFilter.filterWrite(session, (WriteRequest) event.getParameter());
+ }
+ }
+
/**
* Push the newly received data into a queue, waiting for the SSL session
* to be fully established
@@ -309,30 +313,12 @@ class SslHandler {
messageReceivedEventQueue.add(new IoFilterEvent(nextFilter, IoEventType.MESSAGE_RECEIVED, session, message));
}
- /* no qualifier */void flushScheduledEvents() {
- scheduledEvents.incrementAndGet();
-
- // Fire events only when the lock is available for this handler.
- if (sslLock.tryLock()) {
- IoFilterEvent event;
-
- try {
- do {
- // We need synchronization here inevitably because filterWrite can be
- // called simultaneously and cause 'bad record MAC' integrity error.
- while ((event = filterWriteEventQueue.poll()) != null) {
- NextFilter nextFilter = event.getNextFilter();
- nextFilter.filterWrite(session, (WriteRequest) event.getParameter());
- }
-
- while ((event = messageReceivedEventQueue.poll()) != null) {
- NextFilter nextFilter = event.getNextFilter();
- nextFilter.messageReceived(session, event.getParameter());
- }
- } while (scheduledEvents.decrementAndGet() > 0);
- } finally {
- sslLock.unlock();
- }
+ /* no qualifier */void flushMessageReceived() {
+ IoFilterEvent event;
+
+ while ((event = messageReceivedEventQueue.poll()) != null) {
+ NextFilter nextFilter = event.getNextFilter();
+ nextFilter.messageReceived(session, event.getParameter());
}
}
diff --git a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterTest.java b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterTest.java
index d829cc7..ee0d693 100644
--- a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterTest.java
+++ b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterTest.java
@@ -111,8 +111,10 @@ public class SslFilterTest {
// filterWriteEventQueue.
Future<?> write_scheduler = executor.submit(new Runnable() {
public void run() {
- test_class.scheduleFilterWrite(write_filter, new DefaultWriteRequest(new byte[] {}));
- test_class.flushScheduledEvents();
+ synchronized(test_class) {
+ test_class.scheduleFilterWrite(write_filter, new DefaultWriteRequest(new byte[] {}));
+ test_class.flushFilterWrite();
+ }
}
});
@@ -125,9 +127,12 @@ public class SslFilterTest {
public void filterWrite(IoSession session, WriteRequest writeRequest) { }
};
- test_class.scheduleMessageReceived(receive_filter, new byte[] {});
- test_class.flushScheduledEvents();
+ synchronized(test_class) {
+ test_class.scheduleMessageReceived(receive_filter, new byte[] {});
+ }
+ test_class.flushMessageReceived();
+
assertEquals(1, message_received_messages.size());
assertEquals(1, filter_write_requests.size());
}