Browse Source

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
master
Stefan Bodewig 22 years ago
parent
commit
10d7667356
4 changed files with 23 additions and 1 deletions
  1. +5
    -0
      src/etc/testcases/taskdefs/property.xml
  2. +2
    -0
      src/etc/testcases/taskdefs/property4.properties
  3. +4
    -1
      src/main/org/apache/tools/ant/taskdefs/Property.java
  4. +12
    -0
      src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java

+ 5
- 0
src/etc/testcases/taskdefs/property.xml View File

@@ -36,4 +36,9 @@
<property name="someprop" value="value" prefix="prefix"/>
</target>

<!-- caused an endless loop, PR 21825 -->
<target name="testCircularReference">
<property file="property4.properties"/>
</target>

</project>

+ 2
- 0
src/etc/testcases/taskdefs/property4.properties View File

@@ -0,0 +1,2 @@
a=${a}
b=${a}/b

+ 4
- 1
src/main/org/apache/tools/ant/taskdefs/Property.java View File

@@ -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)) {


+ 12
- 0
src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java View File

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

}

Loading…
Cancel
Save