You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by je...@locus.apache.org on 2000/07/19 04:22:46 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/readers StringReader.java
jeffreyr 00/07/18 19:22:46
Modified: java/src/org/apache/xerces/readers StringReader.java
Log:
Fixed bug reported by Michael Brundage,
This bug occurred when you xml document loaded following DTD
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
The following ATTLIST caused the DTDScanner to die:
<!ATTLIST bdo
%coreattrs;
%events;
lang %LanguageCode; #IMPLIED
xml:lang %LanguageCode; #IMPLIED
dir (ltr|rtl) #REQUIRED
>
D:\saxbug>java sax.SAXCount -n testhtml.xml
n
Length of fData = 97
fData = >>lang NMTOKEN #IMPLIED
xml:lang NMTOKEN #IMPLIED
dir (ltr|rtl) #IMPLIED<<index = 34 fCurrentOffset = 4
java.lang.StringIndexOutOfBoundsException: String index out of range: -30
at java.lang.String.substring(String.java:1503)
at org.apache.xerces.readers.StringReader.scanQName(StringReader.java:686)
at org.apache.xerces.framework.XMLDTDScanner.checkForAttributeNameWithPEReference(XMLDTDScanner.java:3120)
at org.apache.xerces.framework.XMLDTDScanner.scanAttlistDecl(XMLDTDScanner.java:2046)
at org.apache.xerces.framework.XMLDTDScanner.scanDecls(XMLDTDScanner.java:1433)
at org.apache.xerces.framework.XMLDocumentScanner.scanDoctypeDecl(XMLDocumentScanner.java:2179)
at org.apache.xerces.framework.XMLDocumentScanner.access$0(XMLDocumentScanner.java:2133)
at org.apache.xerces.framework.XMLDocumentScanner$XMLDeclDispatcher.dispatch(XMLDocumentScanner.java:775)
at org.apache.xerces.framework.XMLDocumentScanner.parseSome(XMLDocumentScanner.java:380)
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:861)
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:900)
at sax.SAXCount.print(SAXCount.java:152)
at sax.SAXCount.main(SAXCount.java:380)
Where we were trying the following:
int index = fData.indexOf(':', nameOffset);
if (index != -1) {
qname.prefix = fStringPool.addSymbol(fData.substring(nameOffset, index));
qname.localpart = fStringPool.addSymbol(fData.substring(index, fCurrentOffset));
}
else {
qname.localpart = qname.rawname;
}
Where index > fCurrentOffset
If we want the local name we need:
qname.localpart = fStringPool.addSymbol(fData.substring(index, index + fCurrentOffset));
We should check the rest of this module for possible bugtraps like this ( check the other
readers + have more unit testcase to test code branches less frequently used).
Jeffrey Rodriguez
Revision Changes Path
1.7 +2 -1 xml-xerces/java/src/org/apache/xerces/readers/StringReader.java
Index: StringReader.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/readers/StringReader.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- StringReader.java 2000/06/13 18:57:19 1.6
+++ StringReader.java 2000/07/19 02:22:46 1.7
@@ -677,10 +677,11 @@
qname.clear();
qname.rawname = fStringPool.addSymbol(fData.substring(nameOffset, fCurrentOffset));
+
int index = fData.indexOf(':', nameOffset);
if (index != -1) {
qname.prefix = fStringPool.addSymbol(fData.substring(nameOffset, index));
- qname.localpart = fStringPool.addSymbol(fData.substring(index, fCurrentOffset));
+ qname.localpart = fStringPool.addSymbol(fData.substring(index, index + fCurrentOffset));
}
else {
qname.localpart = qname.rawname;