Hi,

i played a little with the PNGSuite test suite and found out that iText 
hangs if you use Image.getImage with a corrupt PNG. Here is my bug fix 
for com.lowagie.text.Png.
I just modified 3 methods:

--------------------cut here-------------------

     /**
      * Gets an <CODE>int</CODE> from an <CODE>InputStream</CODE>.
      *
      * @param          an <CODE>InputStream</CODE>
      * @return         the value of an <CODE>int</CODE>
      * @exception IOException if the end of the stream is reached or if 
another error occurs while reading.
      */
     public static final int getInt(InputStream is) throws IOException {
         int c1 = is.read();
         int c2 = is.read();
         int c3 = is.read();
         int c4 = is.read();

         if(c1 != -1 && c2 != -1 && c3 != -1 && c4 != -1) {
             return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;

         } else {
             throw new IOException("end of stream reached");
         }
     }

     /**
      * Gets a <CODE>word</CODE> from an <CODE>InputStream</CODE>.
      *
      * @param          an <CODE>InputStream</CODE>
      * @return         the value of an <CODE>int</CODE>
      * @exception IOException if the end of the stream is reached or if 
another error occurs while reading.
      */
     public static final int getWord(InputStream is) throws IOException {
         int c1 = is.read();
         int c2 = is.read();

         if(c1 != -1 && c2 != -1) {
             return (c1 << 8) + c2;

         } else {
             throw new IOException("end of stream reached");
         }
     }

     /**
      * Gets a <CODE>String</CODE> from an <CODE>InputStream</CODE>.
      *
      * @param          an <CODE>InputStream</CODE>
      * @return         the value of an <CODE>int</CODE>
      * @exception IOException if the end of the stream is reached or if 
another error occurs while reading.
      */
     public static final String getString(InputStream is) throws 
IOException {
         StringBuffer buf = new StringBuffer();

         for (int i = 0; i < 4; i++) {
             int c = is.read();

             if(c != -1) {
                 buf.append((char)c);

             } else {
                 throw new IOException("end of stream reached");
             }
         }

         return buf.toString();
     }

--------------------cut here-------------------

The problem is, that a simple read does not throw an IOException if the 
end of the stream is reached. It just returns -1. So in 
processParameters you read on and on and on because the data is not what 
you expect it to be and you never leave the loop while(true).


Ciao Frank


_______________________________________________________________

Don't miss the 2002 Sprint PCS Application Developer's Conference
August 25-28 in Las Vegas - 
http://devcon.sprintpcs.com/adp/index.cfm?source=osdntextlink

_______________________________________________
iText-questions mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/itext-questions

Reply via email to