Browse Source

bz-63921 Using a "live" keySet() can result in ConcurrentModificationException

master
Jaikiran Pai 5 years ago
parent
commit
c4aeb9cd93
2 changed files with 11 additions and 3 deletions
  1. +2
    -0
      WHATSNEW
  2. +9
    -3
      src/main/org/apache/tools/ant/XmlLogger.java

+ 2
- 0
WHATSNEW View File

@@ -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:
--------------


+ 9
- 3
src/main/org/apache/tools/ant/XmlLogger.java View File

@@ -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;
}

/**


Loading…
Cancel
Save