sandygao 2003/03/24 15:31:04 Modified: java/src/org/apache/xerces/impl/xpath/regex message.properties RegexParser.java Log: Fixing bugs 17417: Regex {min,max} with min > max not rejected. Many thanks to Khaled Noaman for the patch. Revision Changes Path 1.4 +4 -0 xml-xerces/java/src/org/apache/xerces/impl/xpath/regex/message.properties Index: message.properties =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xpath/regex/message.properties,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- message.properties 24 Mar 2003 23:07:45 -0000 1.3 +++ message.properties 24 Mar 2003 23:31:04 -0000 1.4 @@ -30,3 +30,7 @@ parser.descape.4=Invalid Unicode code point. parser.descape.5=An anchor must not be here. parser.process.1=This expression is not supported in the current option setting. ++parser.quantifier.1=Invalid quantifier. A digit is expected. ++parser.quantifier.2=Invalid quantifier. Invalid quantity or a '}' is missing. ++parser.quantifier.3=Invalid quantifier. A digit or '}' is expected. ++parser.quantifier.4=Invalid quantifier. A min quantity must be <= a max quantity. 1.7 +32 -28 xml-xerces/java/src/org/apache/xerces/impl/xpath/regex/RegexParser.java Index: RegexParser.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xpath/regex/RegexParser.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- RegexParser.java 12 Mar 2003 18:57:59 -0000 1.6 +++ RegexParser.java 24 Mar 2003 23:31:04 -0000 1.7 @@ -2,7 +2,7 @@ * The Apache Software License, Version 1.1 * * - * Copyright (c) 1999-2002 The Apache Software Foundation. All rights + * Copyright (c) 1999-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -642,53 +642,57 @@ case T_PLUS: return this.processPlus(tok); case T_QUESTION: return this.processQuestion(tok); case T_CHAR: - if (this.chardata == '{') { - // this.offset -> next of '{' - int off = this.offset; + if (this.chardata == '{' && this.offset < this.regexlen) { + + int off = this.offset; // this.offset -> next of '{' int min = 0, max = -1; - if (off >= this.regexlen) break; - ch = this.regex.charAt(off++); - if (ch != ',' && (ch < '0' || ch > '9')) break; - if (ch != ',') { // 0-9 - min = ch-'0'; + + if ((ch = this.regex.charAt(off++)) >= '0' && ch <= '9') { + + min = ch -'0'; while (off < this.regexlen && (ch = this.regex.charAt(off++)) >= '0' && ch <= '9') { min = min*10 +ch-'0'; - ch = -1; } - if (ch < 0) break; } - //if (off >= this.regexlen) break; + else { + throw ex("parser.quantifier.1", this.offset); + } + max = min; if (ch == ',') { - if (off >= this.regexlen - || ((ch = this.regex.charAt(off++)) < '0' || ch > '9') - && ch != '}') - break; - if (ch == '}') { - max = -1; // {min,} - } else { - max = ch-'0'; // {min,max} + + if (off >= this.regexlen) { + throw ex("parser.quantifier.3", this.offset); + } + else if ((ch = this.regex.charAt(off++)) >= '0' && ch <= '9') { + + max = ch -'0'; // {min,max} while (off < this.regexlen && (ch = this.regex.charAt(off++)) >= '0' && ch <= '9') { max = max*10 +ch-'0'; - ch = -1; } - if (ch < 0) break; - //if (min > max) - // throw new ParseException("parseFactor(): min > max: "+min+", "+max); + + if (min > max) + throw ex("parser.quantifier.4", this.offset); + } + else { // assume {min,} + max = -1; } } - if (ch != '}') break; - // off -> next of '}' - if (this.checkQuestion(off)) { + + if (ch != '}') + throw ex("parser.quantifier.2", this.offset); + + if (this.checkQuestion(off)) { // off -> next of '}' tok = Token.createNGClosure(tok); this.offset = off+1; } else { tok = Token.createClosure(tok); this.offset = off; } + tok.setMin(min); tok.setMax(max); //System.err.println("CLOSURE: "+min+", "+max);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]