This is an automated email from the ASF dual-hosted git repository.

jaikiran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ant.git


The following commit(s) were added to refs/heads/master by this push:
     new c4aeb9c  bz-63921 Using a "live" keySet() can result in 
ConcurrentModificationException
c4aeb9c is described below

commit c4aeb9cd9305d840eb91a798c8313f32580c6f0c
Author: Jaikiran Pai <jaiki...@apache.org>
AuthorDate: Fri Jan 10 19:57:20 2020 +0530

    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 68dc51f..bd2d22f 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 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.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<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;
     }
 
     /**

Reply via email to