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;
     }
 
     /**