# HG changeset patch # User lana # Date 1428103990 25200 # Node ID a9b7fe2baef1260663303192636128130ac0d15c # Parent f40752db7773ca0c737f2ad88371e35c57fdfed7# Parent d0707eacc322e6f6d0f97a8b2143352447f14711 Merge diff -r f40752db7773 -r a9b7fe2baef1 jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java Wed Jul 05 20:26:30 2017 +0200 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java Fri Apr 03 16:33:10 2015 -0700 @@ -270,7 +270,7 @@ if (Double.isNaN(start)) return(EMPTYSTRING); - final int strlen = value.length(); + final int strlen = getStringLength(value); int istart = (int)Math.round(start) - 1; if (istart > strlen) @@ -278,6 +278,7 @@ if (istart < 1) istart = 0; try { + istart = value.offsetByCodePoints(0, istart); return value.substring(istart); } catch (IndexOutOfBoundsException e) { runTimeError(RUN_TIME_INTERNAL_ERR, "substring()"); @@ -297,24 +298,30 @@ return(EMPTYSTRING); int istart = (int)Math.round(start) - 1; + int ilength = (int)Math.round(length); final int isum; if (Double.isInfinite(length)) isum = Integer.MAX_VALUE; else - isum = istart + (int)Math.round(length); + isum = istart + ilength; - final int strlen = value.length(); + final int strlen = getStringLength(value); if (isum < 0 || istart > strlen) return(EMPTYSTRING); - if (istart < 0) + if (istart < 0) { + ilength += istart; istart = 0; + } try { - if (isum > strlen) + istart = value.offsetByCodePoints(0, istart); + if (isum > strlen) { return value.substring(istart); - else - return value.substring(istart, isum); + } else { + int offset = value.offsetByCodePoints(istart, ilength); + return value.substring(istart, offset); + } } catch (IndexOutOfBoundsException e) { runTimeError(RUN_TIME_INTERNAL_ERR, "substring()"); return null; diff -r f40752db7773 -r a9b7fe2baef1 jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDTDScannerImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDTDScannerImpl.java Wed Jul 05 20:26:30 2017 +0200 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDTDScannerImpl.java Fri Apr 03 16:33:10 2015 -0700 @@ -1417,7 +1417,7 @@ // AttValue boolean isVC = !fStandalone && (fSeenExternalDTD || fSeenExternalPE) ; scanAttributeValue(defaultVal, nonNormalizedDefaultVal, atName, - fAttributes, 0, isVC); + fAttributes, 0, isVC, elName); } return defaultType; diff -r f40752db7773 -r a9b7fe2baef1 jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java Wed Jul 05 20:26:30 2017 +0200 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java Fri Apr 03 16:33:10 2015 -0700 @@ -1547,7 +1547,7 @@ scanAttributeValue(tmpStr, fTempString2, fAttributeQName.rawname, attributes, - attIndex, isVC); + attIndex, isVC, fCurrentElement.rawname); // content int oldLen = attributes.getLength(); diff -r f40752db7773 -r a9b7fe2baef1 jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLNSDocumentScannerImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLNSDocumentScannerImpl.java Wed Jul 05 20:26:30 2017 +0200 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLNSDocumentScannerImpl.java Fri Apr 03 16:33:10 2015 -0700 @@ -437,7 +437,7 @@ XMLString tmpStr = getString(); scanAttributeValue(tmpStr, fTempString2, fAttributeQName.rawname, attributes, - attrIndex, isVC); + attrIndex, isVC, fCurrentElement.rawname); String value = null; //fTempString.toString(); diff -r f40752db7773 -r a9b7fe2baef1 jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLScanner.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLScanner.java Wed Jul 05 20:26:30 2017 +0200 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLScanner.java Fri Apr 03 16:33:10 2015 -0700 @@ -811,6 +811,7 @@ * @param attrIndex The index of the attribute to use from the list. * @param checkEntities true if undeclared entities should be reported as VC violation, * false if undeclared entities should be reported as WFC violation. + * @param eleName The name of element to which this attribute belongs. * * Note: This method uses fStringBuffer2, anything in it * at the time of calling is lost. @@ -819,13 +820,13 @@ XMLString nonNormalizedValue, String atName, XMLAttributes attributes, int attrIndex, - boolean checkEntities) + boolean checkEntities, String eleName) throws IOException, XNIException { XMLStringBuffer stringBuffer = null; // quote int quote = fEntityScanner.peekChar(); if (quote != '\'' && quote != '"') { - reportFatalError("OpenQuoteExpected", new Object[]{atName}); + reportFatalError("OpenQuoteExpected", new Object[]{eleName, atName}); } fEntityScanner.scanChar(); @@ -951,7 +952,7 @@ } } else if (c == '<') { reportFatalError("LessthanInAttValue", - new Object[] { null, atName }); + new Object[] { eleName, atName }); fEntityScanner.scanChar(); if (entityDepth == fEntityDepth && fNeedNonNormalizedValue) { fStringBuffer2.append((char)c); @@ -987,7 +988,7 @@ } } else if (c != -1 && isInvalidLiteral(c)) { reportFatalError("InvalidCharInAttValue", - new Object[] {Integer.toString(c, 16)}); + new Object[] {eleName, atName, Integer.toString(c, 16)}); fEntityScanner.scanChar(); if (entityDepth == fEntityDepth && fNeedNonNormalizedValue) { fStringBuffer2.append((char)c); @@ -1016,7 +1017,7 @@ // quote int cquote = fEntityScanner.scanChar(); if (cquote != quote) { - reportFatalError("CloseQuoteExpected", new Object[]{atName}); + reportFatalError("CloseQuoteExpected", new Object[]{eleName, atName}); } } // scanAttributeValue() diff -r f40752db7773 -r a9b7fe2baef1 jaxp/test/javax/xml/jaxp/unittest/javax/xml/parsers/Bug8073385.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/parsers/Bug8073385.java Fri Apr 03 16:33:10 2015 -0700 @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.xml.parsers; + +import java.io.StringReader; +import java.util.Locale; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.DocumentBuilder; +import org.xml.sax.SAXException; +import org.xml.sax.InputSource; + +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import static org.testng.Assert.assertTrue; + +/** + * @bug 8073385 + * @summary test that invalid XML character exception string contains + * information about character value, element and attribute names + */ +public class Bug8073385 { + + private Locale defLoc; + + @BeforeClass + private void setup() { + defLoc = Locale.getDefault(); + Locale.setDefault(Locale.ENGLISH); + } + + @AfterClass + private void cleanup() { + Locale.setDefault(defLoc); + } + + @DataProvider(name = "illegalCharactersData") + public static Object[][] illegalCharactersData() { + return new Object[][]{ + {0x00}, + {0xFFFE}, + {0xFFFF} + }; + } + + @Test(dataProvider = "illegalCharactersData") + public void test(int character) throws Exception { + // Construct the XML document as a String + int[] cps = new int[]{character}; + String txt = new String(cps, 0, cps.length); + String inxml = ""; + String exceptionText = "NO EXCEPTION OBSERVED"; + String hexString = "0x" + Integer.toHexString(character); + + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + dbf.setValidating(false); + DocumentBuilder db = dbf.newDocumentBuilder(); + InputSource isrc = new InputSource(new StringReader(inxml)); + + try { + db.parse(isrc); + } catch (SAXException e) { + exceptionText = e.toString(); + } + System.out.println("Got Exception:" + exceptionText); + assertTrue(exceptionText.contains("attribute \"attTest\"")); + assertTrue(exceptionText.contains("element is \"topElement\"")); + assertTrue(exceptionText.contains("Unicode: " + hexString)); + } +}