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