bz-63921 Using a "live" keySet() can result in ConcurrentModificationException
diff --git a/WHATSNEW b/WHATSNEW
index 68dc51f..bd2d22f 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -26,6 +26,8 @@
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 1f443c0..b75ce2f 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 @@
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<Task> knownTasks = new HashSet<>(tasks.keySet());
+ for (final Task t : knownTasks) {
+ if (t instanceof UnknownElement && ((UnknownElement) t).getTask() == task) {
+ return tasks.get(t);
+ }
+ }
+ return null;
}
/**