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 <[email protected]>
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;
}
/**