Mercurial > hg > openjdk > jdk8u > jaxp
changeset 1996:9094c855c4b4
8223505: Better pattern compilation
Reviewed-by: rriggs, lancea, dfuchs, mschoene
author | joehw |
---|---|
date | Tue, 21 May 2019 13:02:22 -0700 |
parents | e15e896e7df1 |
children | 6f9c0c731ab7 |
files | src/com/sun/org/apache/xpath/internal/compiler/XPathParser.java src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources.java |
diffstat | 2 files changed, 24 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/com/sun/org/apache/xpath/internal/compiler/XPathParser.java Thu Sep 26 07:17:39 2019 +0100 +++ b/src/com/sun/org/apache/xpath/internal/compiler/XPathParser.java Tue May 21 13:02:22 2019 -0700 @@ -1,6 +1,5 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. */ /* * Copyright 1999-2004 The Apache Software Foundation. @@ -37,6 +36,7 @@ * Tokenizes and parses XPath expressions. This should really be named * XPathParserImpl, and may be renamed in the future. * @xsl.usage general + * @LastModified: May 2019 */ public class XPathParser { @@ -74,6 +74,9 @@ protected final static int FILTER_MATCH_PRIMARY = 1; protected final static int FILTER_MATCH_PREDICATES = 2; + // counts open predicates + private int countPredicate; + /** * The parser constructor. */ @@ -160,6 +163,9 @@ } else throw e; + } catch (StackOverflowError sof) { + error(XPATHErrorResources.ER_PREDICATE_TOO_MANY_OPEN, + new Object[]{m_token, m_queueMark, countPredicate}); } compiler.shrink(); @@ -193,7 +199,12 @@ m_ops.setOp(OpMap.MAPINDEX_LENGTH, 2); nextToken(); - Pattern(); + try { + Pattern(); + } catch (StackOverflowError sof) { + error(XPATHErrorResources.ER_PREDICATE_TOO_MANY_OPEN, + new Object[]{m_token, m_queueMark, countPredicate}); + } if (null != m_token) { @@ -789,7 +800,7 @@ */ protected void Expr() throws javax.xml.transform.TransformerException { - OrExpr(); + OrExpr(); } /** @@ -1931,11 +1942,12 @@ */ protected void Predicate() throws javax.xml.transform.TransformerException { - if (tokenIs('[')) { + countPredicate++; nextToken(); PredicateExpr(); + countPredicate--; consumeExpected(']'); } }
--- a/src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources.java Thu Sep 26 07:17:39 2019 +0100 +++ b/src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources.java Tue May 21 13:02:22 2019 -0700 @@ -1,6 +1,5 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. */ /* * Copyright 1999-2005 The Apache Software Foundation. @@ -30,6 +29,7 @@ * Also you need to update the count of messages(MAX_CODE)or * the count of warnings(MAX_WARNING) [ Information purpose only] * @xsl.usage advanced + * @LastModified: May 2019 */ public class XPATHErrorResources extends ListResourceBundle { @@ -147,6 +147,8 @@ "ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG"; public static final String ER_PREDICATE_ILLEGAL_SYNTAX = "ER_PREDICATE_ILLEGAL_SYNTAX"; + public static final String ER_PREDICATE_TOO_MANY_OPEN = + "ER_PREDICATE_TOO_MANY_OPEN"; public static final String ER_ILLEGAL_AXIS_NAME = "ER_ILLEGAL_AXIS_NAME"; public static final String ER_UNKNOWN_NODETYPE = "ER_UNKNOWN_NODETYPE"; public static final String ER_PATTERN_LITERAL_NEEDS_BE_QUOTED = @@ -458,6 +460,9 @@ { ER_PREDICATE_ILLEGAL_SYNTAX, "'..[predicate]' or '.[predicate]' is illegal syntax. Use 'self::node()[predicate]' instead."}, + { ER_PREDICATE_TOO_MANY_OPEN, + "Stack overflow while parsing {0} at {1}. Too many open predicates {2}."}, + { ER_ILLEGAL_AXIS_NAME, "illegal axis name: {0}"},