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 <elecha...@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()); }