You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2014/08/22 05:54:39 UTC
svn commit: r1619657 -
/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
Author: bodewig
Date: Fri Aug 22 03:54:38 2014
New Revision: 1619657
URL: http://svn.apache.org/r1619657
Log:
deal with some potential int overflows
Modified:
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java?rev=1619657&r1=1619656&r2=1619657&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java Fri Aug 22 03:54:38 2014
@@ -74,7 +74,7 @@ public class GzipCompressorInputStream e
// CRC32 from uncompressed data
private final CRC32 crc = new CRC32();
- private int memberSize;
+ private long memberSize;
// True once everything has been decompressed
private boolean endReached = false;
@@ -245,11 +245,11 @@ public class GzipCompressorInputStream e
return bos.toByteArray();
}
- private int readLittleEndianInt(DataInputStream inData) throws IOException {
+ private long readLittleEndianInt(DataInputStream inData) throws IOException {
return inData.readUnsignedByte()
| (inData.readUnsignedByte() << 8)
| (inData.readUnsignedByte() << 16)
- | (inData.readUnsignedByte() << 24);
+ | (((long) inData.readUnsignedByte()) << 24);
}
@Override
@@ -316,10 +316,7 @@ public class GzipCompressorInputStream e
DataInputStream inData = new DataInputStream(in);
// CRC32
- long crcStored = 0;
- for (int i = 0; i < 4; ++i) {
- crcStored |= (long)inData.readUnsignedByte() << (i * 8);
- }
+ long crcStored = readLittleEndianInt(inData);
if (crcStored != crc.getValue()) {
throw new IOException("Gzip-compressed data is corrupt "
@@ -327,12 +324,9 @@ public class GzipCompressorInputStream e
}
// Uncompressed size modulo 2^32 (ISIZE in the spec)
- int isize = 0;
- for (int i = 0; i < 4; ++i) {
- isize |= inData.readUnsignedByte() << (i * 8);
- }
+ long isize = readLittleEndianInt(inData);
- if (isize != memberSize) {
+ if (isize != (memberSize & 0xffffffffl)) {
throw new IOException("Gzip-compressed data is corrupt"
+ "(uncompressed size mismatch)");
}