mrglavas    2003/07/13 14:24:28

  Modified:    java/src/org/apache/xerces/impl XMLScanner.java
  Log:
  Fixing #18597, AIOOBE thrown for invalid char refs of the form &#; &#x; &#2147483648 
(and every other 'codepoint' > 2^31-1).
  
  (http://nagoya.apache.org/bugzilla/show_bug.cgi?id=18597)
  
  Revision  Changes    Path
  1.34      +62 -27    xml-xerces/java/src/org/apache/xerces/impl/XMLScanner.java
  
  Index: XMLScanner.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLScanner.java,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- XMLScanner.java   5 Jun 2003 21:49:03 -0000       1.33
  +++ XMLScanner.java   13 Jul 2003 21:24:28 -0000      1.34
  @@ -1183,32 +1183,58 @@
               hex = true;
               fStringBuffer3.clear();
               boolean digit = true;
  -            do {
  -                int c = fEntityScanner.peekChar();
  -                digit = (c >= '0' && c <= '9') ||
  -                        (c >= 'a' && c <= 'f') ||
  -                        (c >= 'A' && c <= 'F');
  -                if (digit) {
  -                    if (buf2 != null) { buf2.append((char)c); }
  -                    fEntityScanner.scanChar();
  -                    fStringBuffer3.append((char)c);
  -                }
  -            } while (digit);
  +            
  +            int c = fEntityScanner.peekChar();
  +            digit = (c >= '0' && c <= '9') ||
  +                    (c >= 'a' && c <= 'f') ||
  +                    (c >= 'A' && c <= 'F');
  +            if (digit) {
  +                if (buf2 != null) { buf2.append((char)c); }
  +                fEntityScanner.scanChar();
  +                fStringBuffer3.append((char)c);
  +                
  +                do {
  +                    c = fEntityScanner.peekChar();
  +                    digit = (c >= '0' && c <= '9') ||
  +                            (c >= 'a' && c <= 'f') ||
  +                            (c >= 'A' && c <= 'F');
  +                    if (digit) {
  +                        if (buf2 != null) { buf2.append((char)c); }
  +                        fEntityScanner.scanChar();
  +                        fStringBuffer3.append((char)c);
  +                    }
  +                } while (digit);
  +            }
  +            else {
  +                reportFatalError("HexdigitRequiredInCharRef", null);
  +            }
           }
   
           // scan decimal value
           else {
               fStringBuffer3.clear();
               boolean digit = true;
  -            do {
  -                int c = fEntityScanner.peekChar();
  -                digit = c >= '0' && c <= '9';
  -                if (digit) {
  -                    if (buf2 != null) { buf2.append((char)c); }
  -                    fEntityScanner.scanChar();
  -                    fStringBuffer3.append((char)c);
  -                }
  -            } while (digit);
  +            
  +            int c = fEntityScanner.peekChar();
  +            digit = c >= '0' && c <= '9';
  +            if (digit) {
  +                if (buf2 != null) { buf2.append((char)c); }
  +                fEntityScanner.scanChar();
  +                fStringBuffer3.append((char)c);
  +                
  +                do {
  +                    c = fEntityScanner.peekChar();
  +                    digit = c >= '0' && c <= '9';
  +                    if (digit) {
  +                        if (buf2 != null) { buf2.append((char)c); }
  +                        fEntityScanner.scanChar();
  +                        fStringBuffer3.append((char)c);
  +                    }
  +                } while (digit);
  +            }
  +            else {
  +                reportFatalError("DigitRequiredInCharRef", null);
  +            }
           }
   
           // end
  @@ -1222,15 +1248,24 @@
           try {
               value = Integer.parseInt(fStringBuffer3.toString(),
                                        hex ? 16 : 10);
  +            
  +            // character reference must be a valid XML character
  +            if (isInvalid(value)) {
  +             StringBuffer errorBuf = new StringBuffer(fStringBuffer3.length + 1);
  +                if (hex) errorBuf.append('x');
  +                errorBuf.append(fStringBuffer3.ch, fStringBuffer3.offset, 
fStringBuffer3.length);
  +                reportFatalError("InvalidCharRef",
  +                                 new Object[]{errorBuf.toString()});
  +            }
           }
           catch (NumberFormatException e) {
  -            // let -1 value drop through
  -        }
  -
  -        // character reference must be a valid XML character
  -        if (isInvalid(value)) {
  +            // Conversion failed, let -1 value drop through.
  +            // If we end up here, the character reference was invalid.
  +            StringBuffer errorBuf = new StringBuffer(fStringBuffer3.length + 1);
  +            if (hex) errorBuf.append('x');
  +            errorBuf.append(fStringBuffer3.ch, fStringBuffer3.offset, 
fStringBuffer3.length);
               reportFatalError("InvalidCharRef",
  -                             new Object[]{Integer.toString(value, 16)}); 
  +                             new Object[]{errorBuf.toString()});
           }
   
           // append corresponding chars to the given buffer
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to