From dd20676a1d5f82e2a361da213a0154a698f62a6b Mon Sep 17 00:00:00 2001 From: markt Date: Sat, 12 Feb 2011 19:35:26 +0000 Subject: [PATCH] Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50726 Ensure that the use of the genStringAsCharArray does not result in String constants that are too long for valid Java code. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1070139 13f79535-47bb-0310-9956-ffa450edef68 --- java/org/apache/jasper/compiler/Generator.java | 42 ++++++++++++++++++-------- webapps/docs/changelog.xml | 5 +++ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/java/org/apache/jasper/compiler/Generator.java b/java/org/apache/jasper/compiler/Generator.java index 4e088b255..4cec63cc9 100644 --- a/java/org/apache/jasper/compiler/Generator.java +++ b/java/org/apache/jasper/compiler/Generator.java @@ -1975,20 +1975,36 @@ class Generator { } else { caOut = charArrayBuffer.getOut(); } - String charArrayName = textMap.get(text); - if (charArrayName == null) { - charArrayName = "_jspx_char_array_" + charArrayCount++; - textMap.put(text, charArrayName); - caOut.printin("static char[] "); - caOut.print(charArrayName); - caOut.print(" = "); - caOut.print(quote(text)); - caOut.println(".toCharArray();"); + // UTF-8 is up to 4 bytes per character + // String constants are limited to 64k bytes + // Limit string constants here to 16k characters + int textIndex = 0; + int textLength = text.length(); + while (textIndex < textLength) { + int len = 0; + if (textLength - textIndex > 16384) { + len = 16384; + } else { + len = textLength - textIndex; + } + String output = text.substring(textIndex, textIndex + len); + String charArrayName = textMap.get(output); + if (charArrayName == null) { + charArrayName = "_jspx_char_array_" + charArrayCount++; + textMap.put(output, charArrayName); + caOut.printin("static char[] "); + caOut.print(charArrayName); + caOut.print(" = "); + caOut.print(quote(output)); + caOut.println(".toCharArray();"); + } + + n.setBeginJavaLine(out.getJavaLine()); + out.printil("out.write(" + charArrayName + ");"); + n.setEndJavaLine(out.getJavaLine()); + + textIndex = textIndex + len; } - - n.setBeginJavaLine(out.getJavaLine()); - out.printil("out.write(" + charArrayName + ");"); - n.setEndJavaLine(out.getJavaLine()); return; } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 9816fa0f5..a9004adeb 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -93,6 +93,11 @@ for web.xml does not trigger an error when Jasper parses the web.xml file. (markt) + + 50726: Ensure that the use of the genStringAsCharArray does + not result in String constants that are too long for valid Java code. + (markt) + -- 2.11.0