From ac4cdc18ff50d61579a4c53afdff41cf34bd7126 Mon Sep 17 00:00:00 2001 From: Viliam Durina Date: Mon, 21 Dec 2020 16:24:53 +0100 Subject: [PATCH] Fix non-synchronized access to handlers map The user modifies the `handlers` map from his thread. However, when a signal is raised, it's on another thread: on Windows it's `WindowsStreamPump`. Therefore this map is accessed from 2 threads without synchronization. The error manifests as handler not being called. For unknown reason, we only observed it on Windows, but it seems the issue also affects Linux terminals. --- .../main/java/org/jline/terminal/impl/AbstractTerminal.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/terminal/src/main/java/org/jline/terminal/impl/AbstractTerminal.java b/terminal/src/main/java/org/jline/terminal/impl/AbstractTerminal.java index 194c9ab9c..f98aae270 100644 --- a/terminal/src/main/java/org/jline/terminal/impl/AbstractTerminal.java +++ b/terminal/src/main/java/org/jline/terminal/impl/AbstractTerminal.java @@ -17,6 +17,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.IntConsumer; import java.util.function.IntSupplier; @@ -39,7 +40,7 @@ public abstract class AbstractTerminal implements Terminal { protected final String name; protected final String type; protected final Charset encoding; - protected final Map handlers = new HashMap<>(); + protected final Map handlers = new ConcurrentHashMap<>(); protected final Set bools = new HashSet<>(); protected final Map ints = new HashMap<>(); protected final Map strings = new HashMap<>();