mrglavas 2003/11/06 10:57:47
Modified: java/src/org/apache/xerces/impl XML11EntityScanner.java
XMLEntityScanner.java
Log:
Fixing a bug which seems to have arisen from factoring
entity scanner out from the entity manager several
releases ago.
The buffer size passed to the entity scanner
was not being kept in synch with the actual size
of the buffers in each scanned entity. If any
of the buffers were actually resized, it was possible
that the parser would throw an ArrayIndexOutOfBoundsException
for documents which contained names which are longer than
the current buffer size.
Conceivably the buffer size passed to entity scanner could be
used to determine a minimum size for resizing, if doubling the
buffer's size is smaller than this minimum. We currently don't
do this.
Revision Changes Path
1.7 +9 -13
xml-xerces/java/src/org/apache/xerces/impl/XML11EntityScanner.java
Index: XML11EntityScanner.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XML11EntityScanner.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- XML11EntityScanner.java 29 Aug 2003 16:05:37 -0000 1.6
+++ XML11EntityScanner.java 6 Nov 2003 18:57:47 -0000 1.7
@@ -184,13 +184,12 @@
while (XML11Char.isXML11Name(fCurrentEntity.ch[fCurrentEntity.position])) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
int length = fCurrentEntity.position - offset;
- if (length == fBufferSize) {
+ if (length == fCurrentEntity.ch.length) {
// bad luck we have to resize our buffer
- char[] tmp = new char[fBufferSize << 1];
+ char[] tmp = new char[fCurrentEntity.ch.length << 1];
System.arraycopy(fCurrentEntity.ch, offset,
tmp, 0, length);
fCurrentEntity.ch = tmp;
- fBufferSize <<= 1;
}
else {
System.arraycopy(fCurrentEntity.ch, offset,
@@ -251,13 +250,12 @@
while
(XML11Char.isXML11Name(fCurrentEntity.ch[fCurrentEntity.position])) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
int length = fCurrentEntity.position - offset;
- if (length == fBufferSize) {
+ if (length == fCurrentEntity.ch.length) {
// bad luck we have to resize our buffer
- char[] tmp = new char[fBufferSize << 1];
+ char[] tmp = new char[fCurrentEntity.ch.length << 1];
System.arraycopy(fCurrentEntity.ch, offset,
tmp, 0, length);
fCurrentEntity.ch = tmp;
- fBufferSize <<= 1;
}
else {
System.arraycopy(fCurrentEntity.ch, offset,
@@ -320,13 +318,12 @@
while
(XML11Char.isXML11NCName(fCurrentEntity.ch[fCurrentEntity.position])) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
int length = fCurrentEntity.position - offset;
- if (length == fBufferSize) {
+ if (length == fCurrentEntity.ch.length) {
// bad luck we have to resize our buffer
- char[] tmp = new char[fBufferSize * 2];
+ char[] tmp = new char[fCurrentEntity.ch.length << 1];
System.arraycopy(fCurrentEntity.ch, offset,
tmp, 0, length);
fCurrentEntity.ch = tmp;
- fBufferSize *= 2;
}
else {
System.arraycopy(fCurrentEntity.ch, offset,
@@ -405,13 +402,12 @@
}
if (++fCurrentEntity.position == fCurrentEntity.count) {
int length = fCurrentEntity.position - offset;
- if (length == fBufferSize) {
+ if (length == fCurrentEntity.ch.length) {
// bad luck we have to resize our buffer
- char[] tmp = new char[fBufferSize << 1];
+ char[] tmp = new char[fCurrentEntity.ch.length << 1];
System.arraycopy(fCurrentEntity.ch, offset,
tmp, 0, length);
fCurrentEntity.ch = tmp;
- fBufferSize <<= 1;
}
else {
System.arraycopy(fCurrentEntity.ch, offset,
1.17 +19 -13 xml-xerces/java/src/org/apache/xerces/impl/XMLEntityScanner.java
Index: XMLEntityScanner.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLEntityScanner.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- XMLEntityScanner.java 5 Jun 2003 21:46:18 -0000 1.16
+++ XMLEntityScanner.java 6 Nov 2003 18:57:47 -0000 1.17
@@ -325,13 +325,12 @@
while (XMLChar.isName(fCurrentEntity.ch[fCurrentEntity.position])) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
int length = fCurrentEntity.position - offset;
- if (length == fBufferSize) {
+ if (length == fCurrentEntity.ch.length) {
// bad luck we have to resize our buffer
- char[] tmp = new char[fBufferSize * 2];
+ char[] tmp = new char[fCurrentEntity.ch.length << 1];
System.arraycopy(fCurrentEntity.ch, offset,
tmp, 0, length);
fCurrentEntity.ch = tmp;
- fBufferSize *= 2;
}
else {
System.arraycopy(fCurrentEntity.ch, offset,
@@ -408,13 +407,12 @@
while (XMLChar.isName(fCurrentEntity.ch[fCurrentEntity.position])) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
int length = fCurrentEntity.position - offset;
- if (length == fBufferSize) {
+ if (length == fCurrentEntity.ch.length) {
// bad luck we have to resize our buffer
- char[] tmp = new char[fBufferSize * 2];
+ char[] tmp = new char[fCurrentEntity.ch.length << 1];
System.arraycopy(fCurrentEntity.ch, offset,
tmp, 0, length);
fCurrentEntity.ch = tmp;
- fBufferSize *= 2;
}
else {
System.arraycopy(fCurrentEntity.ch, offset,
@@ -492,13 +490,12 @@
while (XMLChar.isNCName(fCurrentEntity.ch[fCurrentEntity.position])) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
int length = fCurrentEntity.position - offset;
- if (length == fBufferSize) {
+ if (length == fCurrentEntity.ch.length) {
// bad luck we have to resize our buffer
- char[] tmp = new char[fBufferSize * 2];
+ char[] tmp = new char[fCurrentEntity.ch.length << 1];
System.arraycopy(fCurrentEntity.ch, offset,
tmp, 0, length);
fCurrentEntity.ch = tmp;
- fBufferSize *= 2;
}
else {
System.arraycopy(fCurrentEntity.ch, offset,
@@ -593,13 +590,12 @@
}
if (++fCurrentEntity.position == fCurrentEntity.count) {
int length = fCurrentEntity.position - offset;
- if (length == fBufferSize) {
+ if (length == fCurrentEntity.ch.length) {
// bad luck we have to resize our buffer
- char[] tmp = new char[fBufferSize * 2];
+ char[] tmp = new char[fCurrentEntity.ch.length << 1];
System.arraycopy(fCurrentEntity.ch, offset,
tmp, 0, length);
fCurrentEntity.ch = tmp;
- fBufferSize *= 2;
}
else {
System.arraycopy(fCurrentEntity.ch, offset,
@@ -1597,6 +1593,16 @@
// set buffer size:
public void setBufferSize(int size) {
+ // REVISIT: Buffer size passed to entity scanner
+ // was not being kept in synch with the actual size
+ // of the buffers in each scanned entity. If any
+ // of the buffers were actually resized, it was possible
+ // that the parser would throw an ArrayIndexOutOfBoundsException
+ // for documents which contained names which are longer than
+ // the current buffer size. Conceivably the buffer size passed
+ // to entity scanner could be used to determine a minimum size
+ // for resizing, if doubling its size is smaller than this
+ // minimum. -- mrglavas
fBufferSize = size;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]