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");
+ }
+
}