From a1eaf82ea525bd37a45f9dd03d6b784883d07410 Mon Sep 17 00:00:00 2001 From: mcherkas Date: Fri, 13 May 2016 16:46:54 +0300 Subject: [PATCH] 8078268: javax.swing.text.html.parser.Parser parseScript incorrectly optimized Reviewed-by: alexp, aivanov --- .../javax/swing/text/html/parser/Parser.java | 94 +++++++++++-------- .../parser/Parser/8078268/bug8078268.java | 0 .../html/parser/Parser/8078268/slowparse.html | 0 3 files changed, 53 insertions(+), 41 deletions(-) create mode 100644 test/javax/swing/text/html/parser/Parser/8078268/bug8078268.java create mode 100644 test/javax/swing/text/html/parser/Parser/8078268/slowparse.html diff --git a/src/share/classes/javax/swing/text/html/parser/Parser.java b/src/share/classes/javax/swing/text/html/parser/Parser.java index 79124461f..21f570372 100644 --- a/src/share/classes/javax/swing/text/html/parser/Parser.java +++ b/src/share/classes/javax/swing/text/html/parser/Parser.java @@ -1986,57 +1986,69 @@ class Parser implements DTDConstants { while (true) { int i = 0; while (!insideComment && i < SCRIPT_END_TAG.length - && (SCRIPT_END_TAG[i] == ch - || SCRIPT_END_TAG_UPPER_CASE[i] == ch)) { + && (SCRIPT_END_TAG[i] == ch + || SCRIPT_END_TAG_UPPER_CASE[i] == ch)) { charsToAdd[i] = (char) ch; ch = readCh(); i++; } if (i == SCRIPT_END_TAG.length) { - - /* '' tag detected */ - /* Here, ch == the first character after */ return; - } else { - - /* To account for extra read()'s that happened */ - for (int j = 0; j < i; j++) { - addString(charsToAdd[j]); - } + } - switch (ch) { - case -1: - error("eof.script"); - return; - case '\n': - ln++; + if (!insideComment && i == 1 && charsToAdd[0] == START_COMMENT.charAt(0)) { + // it isn't end script tag, but may be it's start comment tag? + while (i < START_COMMENT.length() + && START_COMMENT.charAt(i) == ch) { + charsToAdd[i] = (char) ch; ch = readCh(); - lfCount++; - addString('\n'); - break; - case '\r': - ln++; - if ((ch = readCh()) == '\n') { - ch = readCh(); - crlfCount++; - } else { - crCount++; - } - addString('\n'); - break; - default: - addString(ch); - String str = new String(getChars(0, strpos)); - if (!insideComment && str.endsWith(START_COMMENT)) { - insideComment = true; - } - if (insideComment && str.endsWith(END_COMMENT)) { - insideComment = false; - } + i++; + } + if (i == START_COMMENT.length()) { + insideComment = true; + } + } + if (insideComment) { + while (i < END_COMMENT.length() + && END_COMMENT.charAt(i) == ch) { + charsToAdd[i] = (char) ch; ch = readCh(); - break; - } // switch + i++; + } + if (i == END_COMMENT.length()) { + insideComment = false; + } + } + + /* To account for extra read()'s that happened */ + for (int j = 0; j < i; j++) { + addString(charsToAdd[j]); } + switch (ch) { + case -1: + error("eof.script"); + return; + case '\n': + ln++; + ch = readCh(); + lfCount++; + addString('\n'); + break; + case '\r': + ln++; + if ((ch = readCh()) == '\n') { + ch = readCh(); + crlfCount++; + } else { + crCount++; + } + addString('\n'); + break; + default: + addString(ch); + ch = readCh(); + break; + } // switch } // while } diff --git a/test/javax/swing/text/html/parser/Parser/8078268/bug8078268.java b/test/javax/swing/text/html/parser/Parser/8078268/bug8078268.java new file mode 100644 index 000000000..e69de29bb diff --git a/test/javax/swing/text/html/parser/Parser/8078268/slowparse.html b/test/javax/swing/text/html/parser/Parser/8078268/slowparse.html new file mode 100644 index 000000000..e69de29bb -- GitLab