diff --git a/WHATSNEW b/WHATSNEW index 68dc51fed..bd2d22fad 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 1f443c085..b75ce2f4d 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.io.Writer; 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 @@ public class XmlLogger implements BuildLogger { 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; } /**