This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 18922f05b0 [FIX] IDLE - prevent data race upon answers on channel 
writes (#2525)
18922f05b0 is described below

commit 18922f05b0c628a75c5bc0018b0b94b38e4a453d
Author: Benoit TELLIER <[email protected]>
AuthorDate: Mon Dec 2 16:14:17 2024 +0100

    [FIX] IDLE - prevent data race upon answers on channel writes (#2525)
---
 .../org/apache/james/imap/api/process/ImapSession.java  |  4 ++++
 .../org/apache/james/imap/processor/IdleProcessor.java  |  2 +-
 .../apache/james/imapserver/netty/NettyImapSession.java | 17 +++++++++++++++++
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
index a95ef8a04a..e55c595301 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
@@ -102,6 +102,10 @@ public interface ImapSession extends 
CommandDetectionSession {
         runnable.run();
     }
 
+    default ImapProcessor.Responder threadSafe(ImapProcessor.Responder 
responder) {
+        return responder;
+    }
+
     /**
      * Logs out the session. Marks the connection for closure;
      */
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
index e4c3830f72..322d58f2be 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
@@ -173,7 +173,7 @@ public class IdleProcessor extends 
AbstractMailboxProcessor<IdleRequest> impleme
 
         public IdleMailboxListener(ImapSession session, Responder responder, 
CountDownLatch countDownLatch) {
             this.session = session;
-            this.responder = responder;
+            this.responder = session.threadSafe(responder);
             this.countDownLatch = countDownLatch;
         }
 
diff --git 
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
 
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
index 22d6614c89..7ec85cdcab 100644
--- 
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
+++ 
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
@@ -32,7 +32,9 @@ import javax.net.ssl.SSLSession;
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapSessionState;
+import org.apache.james.imap.api.message.response.ImapResponseMessage;
 import org.apache.james.imap.api.process.ImapLineHandler;
+import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.api.process.SelectedMailbox;
 import org.apache.james.imap.encode.ImapResponseWriter;
@@ -113,6 +115,21 @@ public class NettyImapSession implements ImapSession, 
NettyConstants {
         });
     }
 
+    @Override
+    public ImapProcessor.Responder threadSafe(ImapProcessor.Responder 
responder) {
+        return new ImapProcessor.Responder() {
+            @Override
+            public void respond(ImapResponseMessage message) {
+                channel.eventLoop().execute(() -> responder.respond(message));
+            }
+
+            @Override
+            public void flush() {
+                channel.eventLoop().execute(responder::flush);
+            }
+        };
+    }
+
     @Override
     public Mono<Void> logout() {
         return closeMailbox()


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to