From 10d76673568976d071281e370173e4004168e482 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Wed, 23 Jul 2003 15:14:19 +0000 Subject: [PATCH] resolveAllProperties would be caught in an endless loop when trying to expand b -> ${a} -> ${a}. It would keep replacing ${a} for ${a} as it only detected a circular reference if the expansion pointed back to b. PR: 21825 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274914 13f79535-47bb-0310-9956-ffa450edef68 --- src/etc/testcases/taskdefs/property.xml | 5 +++++ src/etc/testcases/taskdefs/property4.properties | 2 ++ src/main/org/apache/tools/ant/taskdefs/Property.java | 5 ++++- .../org/apache/tools/ant/taskdefs/PropertyTest.java | 12 ++++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/etc/testcases/taskdefs/property4.properties diff --git a/src/etc/testcases/taskdefs/property.xml b/src/etc/testcases/taskdefs/property.xml index 75fbe6940..00bfbcdda 100644 --- a/src/etc/testcases/taskdefs/property.xml +++ b/src/etc/testcases/taskdefs/property.xml @@ -36,4 +36,9 @@ + + + + + diff --git a/src/etc/testcases/taskdefs/property4.properties b/src/etc/testcases/taskdefs/property4.properties new file mode 100644 index 000000000..d2af886e5 --- /dev/null +++ b/src/etc/testcases/taskdefs/property4.properties @@ -0,0 +1,2 @@ +a=${a} +b=${a}/b diff --git a/src/main/org/apache/tools/ant/taskdefs/Property.java b/src/main/org/apache/tools/ant/taskdefs/Property.java index 2fe2c36aa..ae998571c 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Property.java +++ b/src/main/org/apache/tools/ant/taskdefs/Property.java @@ -573,6 +573,8 @@ public class Property extends Task { String value = props.getProperty(name); boolean resolved = false; + Vector expandedReferences = new Vector(); + expandedReferences.addElement(name); while (!resolved) { Vector fragments = new Vector(); Vector propertyRefs = new Vector(); @@ -588,11 +590,12 @@ public class Property extends Task { String fragment = (String) i.nextElement(); if (fragment == null) { String propertyName = (String) j.nextElement(); - if (propertyName.equals(name)) { + if (expandedReferences.contains(propertyName)) { throw new BuildException("Property " + name + " was circularly " + "defined."); } + expandedReferences.addElement(propertyName); fragment = getProject().getProperty(propertyName); if (fragment == null) { if (props.containsKey(propertyName)) { diff --git a/src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java b/src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java index 0fe9ea09c..2ba10b657 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java @@ -116,4 +116,16 @@ public class PropertyTest extends BuildFileTest { fail("Did not throw exception on invalid use of prefix"); } + public void testCircularReference() { + try { + executeTarget("testCircularReference"); + } catch (BuildException e) { + assertEquals("Circular definition not detected - ", true, + e.getMessage().indexOf("was circularly defined") + != -1); + return; + } + fail("Did not throw exception on circular exception"); + } + }