OSDN Git Service

PR libgcj/14446:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Sep 2004 20:16:17 +0000 (20:16 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Sep 2004 20:16:17 +0000 (20:16 +0000)
* java/util/zip/GZIPInputStream.java (read): Avoid sign extension
when comparing CRCs.
* java/util/zip/InflaterInputStream.java (onebytebuffer): New
field.
(read()): New overload.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87882 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/util/zip/GZIPInputStream.java
libjava/java/util/zip/InflaterInputStream.java

index bb05c53..df804df 100644 (file)
@@ -1,3 +1,12 @@
+2004-09-22  Tom Tromey  <tromey@redhat.com>
+
+       PR libgcj/14446:
+       * java/util/zip/GZIPInputStream.java (read): Avoid sign extension
+       when comparing CRCs.
+       * java/util/zip/InflaterInputStream.java (onebytebuffer): New
+       field.
+       (read()): New overload.
+
 2004-09-21  Tom Tromey  <tromey@redhat.com>
 
        * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA):
index 9eef73e..5640163 100644 (file)
@@ -230,7 +230,9 @@ public class GZIPInputStream
            tmp[i] = (byte) eof_read();
          }
 
-       int header_crc = read4(tmp, 0);
+       // Be careful to avoid sign extension here; CRC32.getValue()
+       // returns a long.
+       long header_crc = read4(tmp, 0) & 0xffffffffL;
        if (crc.getValue() != header_crc)
          throw new ZipException("corrupted gzip file - crc mismatch");
        int isize = read4(tmp, 4);
index 27c29ff..3676a2c 100644 (file)
@@ -70,6 +70,9 @@ public class InflaterInputStream extends FilterInputStream
    */
   protected int len;
 
+  // We just use this if we are decoding one byte at a time with the
+  // read() call.
+  private byte[] onebytebuffer = new byte[1];
 
   /**
    * Create an InflaterInputStream with the default decompresseor
@@ -156,6 +159,19 @@ public class InflaterInputStream extends FilterInputStream
   }
 
   /**
+   * Reads one byte of decompressed data.
+   *
+   * The byte is in the lower 8 bits of the int.
+   */
+  public int read() throws IOException
+  { 
+    int nread = read(onebytebuffer, 0, 1);
+    if (nread > 0)
+      return onebytebuffer[0] & 0xff;
+    return -1;
+  }
+
+  /**
    * Decompresses data into the byte array
    *
    * @param b the array to read and decompress data into