From c4aeb9cd9305d840eb91a798c8313f32580c6f0c Mon Sep 17 00:00:00 2001 From: Jaikiran Pai Date: Fri, 10 Jan 2020 19:57:20 +0530 Subject: [PATCH] bz-63921 Using a "live" keySet() can result in ConcurrentModificationException --- WHATSNEW | 2 ++ src/main/org/apache/tools/ant/XmlLogger.java | 12 +++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/WHATSNEW b/WHATSNEW index 68dc51fed0..bd2d22fada 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -26,6 +26,8 @@ Fixed bugs: optional dependencies were missing. This has now been fixed. Bugzilla Report 63438 + * Fixes a potential ConcurrentModificationException in XMLLogger. + Bugzilla Report 63921 Other changes: -------------- diff --git a/src/main/org/apache/tools/ant/XmlLogger.java b/src/main/org/apache/tools/ant/XmlLogger.java index 1f443c085e..b75ce2f4de 100644 --- a/src/main/org/apache/tools/ant/XmlLogger.java +++ b/src/main/org/apache/tools/ant/XmlLogger.java @@ -25,8 +25,10 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.HashSet; import java.util.Hashtable; import java.util.Map; +import java.util.Set; import java.util.Stack; import javax.xml.parsers.DocumentBuilder; @@ -346,9 +348,13 @@ private TimedElement getTaskElement(Task task) { if (element != null) { return element; } - return tasks.keySet().stream().filter(UnknownElement.class::isInstance) - .filter(key -> ((UnknownElement) key).getTask() == task).findFirst() - .map(key -> tasks.get(key)).orElse(null); + final Set knownTasks = new HashSet<>(tasks.keySet()); + for (final Task t : knownTasks) { + if (t instanceof UnknownElement && ((UnknownElement) t).getTask() == task) { + return tasks.get(t); + } + } + return null; } /**