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]

Reply via email to