Index: src/main/java/java/util/zip/GZIPInputStream.java =================================================================== --- src/main/java/java/util/zip/GZIPInputStream.java (revision 537921) +++ src/main/java/java/util/zip/GZIPInputStream.java (working copy) @@ -149,14 +149,12 @@ eos = true; // Get non-compressed bytes read by fill int size = inf.getRemaining(); - byte[] b = new byte[8]; + final int trailerSize = 8; // crc (4 bytes) + total out (4 bytes) + byte[] b = new byte[trailerSize]; + int copySize = (size > trailerSize) ? trailerSize : size; + System.arraycopy(buf, len - size, b, 0, copySize); + readFully(b, copySize, trailerSize - copySize); - if (size > b.length) { - size = b.length; - } - System.arraycopy(buf, len - size, b, 0, size); - readFully(b, size, b.length - size); - if (getLong(b, 0) != crc.getValue()) { throw new IOException(Messages.getString("archive.20")); //$NON-NLS-1$ } Index: src/test/java/org/apache/harmony/archive/tests/java/util/zip/GZIPInputStreamTest.java =================================================================== --- src/test/java/org/apache/harmony/archive/tests/java/util/zip/GZIPInputStreamTest.java (revision 537921) +++ src/test/java/org/apache/harmony/archive/tests/java/util/zip/GZIPInputStreamTest.java (working copy) @@ -19,6 +19,8 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; @@ -253,6 +255,33 @@ } } + /** + * Regression test for HARMONY-3703. + * @tests java.util.zip.GZIPInputStream#read() + */ + public void test_read() throws IOException { + GZIPInputStream gis = null; + int result = 0; + byte[] buffer = new byte[] {1,2,3,4,5,6,7,8,9,10}; + File f = new File(resources.toString() + "test.gz"); + FileOutputStream out = new FileOutputStream(f); + GZIPOutputStream gout = new GZIPOutputStream(out); + + // write 100 bytes to the stream + for(int i = 0; i < 10; i++) { + gout.write(buffer); + } + gout.finish(); + gout = new GZIPOutputStream(out); + gout.close(); + gis = new GZIPInputStream(new FileInputStream(f)); + buffer = new byte[100]; + gis.read(buffer); + result = gis.read(); + gis.close(); + assertEquals("Incorrect value returned at the end of the file", -1, result); + } + @Override protected void setUp() { resources = Support_Resources.createTempFolder();