From ff1a98df58d49ea75c5db93284515b18f3b5ed6b Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Wed, 7 Sep 2022 10:59:36 +0200 Subject: [PATCH] [JENKINS-69543] Fix thread safety Session-holding maps are accessed by multiple threads. Even though some concurrent access version of this would perform better it should be safe to access sessions in a synchronized way. org.springframework.util.ConcurrentReferenceHashMap could be an alternative if synchronized access is too slow. --- .../src/main/java/jenkins/websocket/Jetty10Provider.java | 3 ++- .../jetty9/src/main/java/jenkins/websocket/Jetty9Provider.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/websocket/jetty10/src/main/java/jenkins/websocket/Jetty10Provider.java b/websocket/jetty10/src/main/java/jenkins/websocket/Jetty10Provider.java index a6b98ead54a7..2a5f5dc72600 100644 --- a/websocket/jetty10/src/main/java/jenkins/websocket/Jetty10Provider.java +++ b/websocket/jetty10/src/main/java/jenkins/websocket/Jetty10Provider.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Collections; import java.util.Map; import java.util.WeakHashMap; import java.util.concurrent.CompletableFuture; @@ -49,7 +50,7 @@ public class Jetty10Provider implements Provider { private static final String ATTR_LISTENER = Jetty10Provider.class.getName() + ".listener"; // TODO does not seem possible to use HttpServletRequest.get/setAttribute for this - private static final Map sessions = new WeakHashMap<>(); + private static final Map sessions = Collections.synchronizedMap(new WeakHashMap<>()); public Jetty10Provider() { JettyWebSocketServerContainer.class.hashCode(); diff --git a/websocket/jetty9/src/main/java/jenkins/websocket/Jetty9Provider.java b/websocket/jetty9/src/main/java/jenkins/websocket/Jetty9Provider.java index ed5156980f7b..078e0c2480df 100644 --- a/websocket/jetty9/src/main/java/jenkins/websocket/Jetty9Provider.java +++ b/websocket/jetty9/src/main/java/jenkins/websocket/Jetty9Provider.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Collections; import java.util.Map; import java.util.WeakHashMap; import java.util.concurrent.Future; @@ -48,7 +49,7 @@ public class Jetty9Provider implements Provider { private static final String ATTR_LISTENER = Jetty9Provider.class.getName() + ".listener"; // TODO does not seem possible to use HttpServletRequest.get/setAttribute for this - private static final Map sessions = new WeakHashMap<>(); + private static final Map sessions = Collections.synchronizedMap(new WeakHashMap<>()); private WebSocketServletFactory factory;