diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index bb05c53795be46d4a71ca3891a856bd8e66cc1eb..df804df9c91c9855374f0c70d7973ccfa47881af 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -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):
diff --git a/libjava/java/util/zip/GZIPInputStream.java b/libjava/java/util/zip/GZIPInputStream.java
index 9eef73eb9453ac025f5b119a2baef51708f63365..56401639e0cb0e8a7c99f911f42f20598e6685d5 100644
--- a/libjava/java/util/zip/GZIPInputStream.java
+++ b/libjava/java/util/zip/GZIPInputStream.java
@@ -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);
diff --git a/libjava/java/util/zip/InflaterInputStream.java b/libjava/java/util/zip/InflaterInputStream.java
index 27c29ff41dfd4dac0a70330ebf76a1ce0c68811c..3676a2cdb5d7c1f329754b408c743947632081a7 100644
--- a/libjava/java/util/zip/InflaterInputStream.java
+++ b/libjava/java/util/zip/InflaterInputStream.java
@@ -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
@@ -155,6 +158,19 @@ public class InflaterInputStream extends FilterInputStream
     inf.setInput(buf, 0, len);
   }
 
+  /**
+   * 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
    *