Author: pbenedict Date: Sun Dec 21 10:58:12 2008 New Revision: 728475 URL: http://svn.apache.org/viewvc?rev=728475&view=rev Log: STR-3169: Do not match when recursive substitutions are detected
Modified: struts/struts1/branches/STRUTS_1_3_BRANCH/core/src/main/java/org/apache/struts/config/ActionConfigMatcher.java Modified: struts/struts1/branches/STRUTS_1_3_BRANCH/core/src/main/java/org/apache/struts/config/ActionConfigMatcher.java URL: http://svn.apache.org/viewvc/struts/struts1/branches/STRUTS_1_3_BRANCH/core/src/main/java/org/apache/struts/config/ActionConfigMatcher.java?rev=728475&r1=728474&r2=728475&view=diff ============================================================================== --- struts/struts1/branches/STRUTS_1_3_BRANCH/core/src/main/java/org/apache/struts/config/ActionConfigMatcher.java (original) +++ struts/struts1/branches/STRUTS_1_3_BRANCH/core/src/main/java/org/apache/struts/config/ActionConfigMatcher.java Sun Dec 21 10:58:12 2008 @@ -260,16 +260,23 @@ Map.Entry entry; StringBuffer key = new StringBuffer("{0}"); StringBuffer ret = new StringBuffer(val); - String keyTmp; + String keyStr; int x; for (Iterator i = vars.entrySet().iterator(); i.hasNext();) { entry = (Map.Entry) i.next(); key.setCharAt(1, ((String) entry.getKey()).charAt(0)); - keyTmp = key.toString(); - + keyStr = key.toString(); + + // STR-3169 + // Prevent an infinite loop by retaining the placeholders + // that contain itself in the substitution value + if (((String) entry.getValue()).contains(keyStr)) { + throw new IllegalStateException(); + } + // Replace all instances of the placeholder - while ((x = ret.toString().indexOf(keyTmp)) > -1) { + while ((x = ret.toString().indexOf(keyStr)) > -1) { ret.replace(x, x + 3, (String) entry.getValue()); } }