Repository: ant Updated Branches: refs/heads/master b510f3588 -> 41eb0d922
Fixing a potential ConcurrentModificationException that could occur when running Ant with the Parallel-Ant executor. This closes #81 pull request at github/apache/ant Project: http://git-wip-us.apache.org/repos/asf/ant/repo Commit: http://git-wip-us.apache.org/repos/asf/ant/commit/41eb0d92 Tree: http://git-wip-us.apache.org/repos/asf/ant/tree/41eb0d92 Diff: http://git-wip-us.apache.org/repos/asf/ant/diff/41eb0d92 Branch: refs/heads/master Commit: 41eb0d922b88428111b554c044fdc5942afa22bb Parents: b510f35 Author: mharmer <[email protected]> Authored: Tue Dec 11 14:02:37 2018 -0800 Committer: Jaikiran Pai <[email protected]> Committed: Wed Dec 12 11:38:34 2018 +0530 ---------------------------------------------------------------------- CONTRIBUTORS | 1 + WHATSNEW | 4 +++ contributors.xml | 4 +++ src/main/org/apache/tools/ant/Project.java | 44 ++++++++++++++++--------- 4 files changed, 37 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ant/blob/41eb0d92/CONTRIBUTORS ---------------------------------------------------------------------- diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 9b0c263..c6338ef 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -251,6 +251,7 @@ Mario Frasca Mariusz Nowostawski Mark A. Ziesemer Mark DeLaFranier +Mark Harmer Mark Hecker Mark Niggemann Mark R. Diggory http://git-wip-us.apache.org/repos/asf/ant/blob/41eb0d92/WHATSNEW ---------------------------------------------------------------------- diff --git a/WHATSNEW b/WHATSNEW index a74856e..9229d48 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -33,6 +33,10 @@ Fixed bugs: of the destination directory. Bugzilla Report 62890 + * Fixes a potential java.util.ConcurrentModificationException in + org.apache.tools.ant.Project#getCopyOfReferences. + Github Pull Request #81 + Other changes: -------------- http://git-wip-us.apache.org/repos/asf/ant/blob/41eb0d92/contributors.xml ---------------------------------------------------------------------- diff --git a/contributors.xml b/contributors.xml index ebf03ee..c56bd24 100644 --- a/contributors.xml +++ b/contributors.xml @@ -1047,6 +1047,10 @@ </name> <name> <first>Mark</first> + <last>Harmer</last> + </name> + <name> + <first>Mark</first> <last>Hecker</last> </name> <name> http://git-wip-us.apache.org/repos/asf/ant/blob/41eb0d92/src/main/org/apache/tools/ant/Project.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/Project.java b/src/main/org/apache/tools/ant/Project.java index 62aafbc..39a83a4 100644 --- a/src/main/org/apache/tools/ant/Project.java +++ b/src/main/org/apache/tools/ant/Project.java @@ -140,6 +140,9 @@ public class Project implements ResourceFactory { private String description; + /** lock object used when adding/removing references */ + private final Object referencesLock = new Object(); + /** Map of references within the project (paths etc) (String to Object). */ private final Hashtable<String, Object> references = new AntRefTable(); @@ -1971,17 +1974,19 @@ public class Project implements ResourceFactory { * @param value The value of the reference. */ public void addReference(final String referenceName, final Object value) { - final Object old = ((AntRefTable) references).getReal(referenceName); - if (old == value) { - // no warning, this is not changing anything - return; - } - if (old != null && !(old instanceof UnknownElement)) { - log("Overriding previous definition of reference to " + referenceName, - MSG_VERBOSE); + synchronized (referencesLock) { + final Object old = ((AntRefTable) references).getReal(referenceName); + if (old == value) { + // no warning, this is not changing anything + return; + } + if (old != null && !(old instanceof UnknownElement)) { + log("Overriding previous definition of reference to " + referenceName, + MSG_VERBOSE); + } + log("Adding reference: " + referenceName, MSG_DEBUG); + references.put(referenceName, value); } - log("Adding reference: " + referenceName, MSG_DEBUG); - references.put(referenceName, value); } /** @@ -2002,7 +2007,9 @@ public class Project implements ResourceFactory { * @since Ant 1.8.0 */ public boolean hasReference(final String key) { - return references.containsKey(key); + synchronized (referencesLock) { + return references.containsKey(key); + } } /** @@ -2015,7 +2022,9 @@ public class Project implements ResourceFactory { * @since Ant 1.8.1 */ public Map<String, Object> getCopyOfReferences() { - return new HashMap<>(references); + synchronized (referencesLock) { + return new HashMap<>(references); + } } /** @@ -2029,11 +2038,14 @@ public class Project implements ResourceFactory { * there is no such reference in the project, with type inference. */ public <T> T getReference(final String key) { - @SuppressWarnings("unchecked") - final T ret = (T) references.get(key); - if (ret != null) { - return ret; + synchronized (referencesLock) { + @SuppressWarnings("unchecked") + final T ret = (T) references.get(key); + if (ret != null) { + return ret; + } } + if (!key.equals(MagicNames.REFID_PROPERTY_HELPER)) { try { if (PropertyHelper.getPropertyHelper(this).containsProperties(key)) {
