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]