diff --git a/WHATSNEW b/WHATSNEW index 9e3fc05e6..1983dcc40 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -20,6 +20,9 @@ Changes that could break older environments: ampersands so that { remained { rather than being turned into {. This is no longer the case, ampersands will now be encoded unconditionally. + Also DOMElementWriter#encodeData will treat CDATA sections containing a + literal "]]>" sequence different now - it will split the CDATA + section between the second "]" and ">" and create two sections. This affects task as well as the XML logger or JUnit formatter where ampersands will now always get encoded. Bugzilla Report 49404. diff --git a/src/main/org/apache/tools/ant/util/DOMElementWriter.java b/src/main/org/apache/tools/ant/util/DOMElementWriter.java index a1fe3de6b..2b65d215c 100644 --- a/src/main/org/apache/tools/ant/util/DOMElementWriter.java +++ b/src/main/org/apache/tools/ant/util/DOMElementWriter.java @@ -467,19 +467,7 @@ public class DOMElementWriter { } } - String result = sb.substring(0); - int cdEnd = result.indexOf("]]>"); - while (cdEnd != -1) { - sb.setLength(cdEnd); - // CheckStyle:MagicNumber OFF - sb.append("]]>") - .append(result.substring(cdEnd + 3)); - // CheckStyle:MagicNumber ON - result = sb.substring(0); - cdEnd = result.indexOf("]]>"); - } - - return result; + return sb.toString().replace("]]>", "]]]]>"); } /** diff --git a/src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java b/src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java index a6f81e39b..ff8ed6258 100644 --- a/src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java +++ b/src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java @@ -90,11 +90,11 @@ public class DOMElementWriterTest extends TestCase { public void testCDATAEndEncoding() { assertEquals("]>", w.encodedata("]>")); assertEquals("]]", w.encodedata("]]")); - assertEquals("]]>", w.encodedata("]]>")); - assertEquals("]]>A", w.encodedata("]]>A")); - assertEquals("A]]>", w.encodedata("A]]>")); - assertEquals("A]]>A", w.encodedata("A]]>A")); - assertEquals("A]]>B]]>C", + assertEquals("]]]]>", w.encodedata("]]>")); + assertEquals("]]]]>A", w.encodedata("]]>A")); + assertEquals("A]]]]>", w.encodedata("A]]>")); + assertEquals("A]]]]>A", w.encodedata("A]]>A")); + assertEquals("A]]]]>B]]]]>C", w.encodedata("A]]>B]]>C")); }