Values in ZIP files are unsigned. Bug: 9695860 Change-Id: I5c12dc5f3c70a9fe081adf5bf5b6b4b3a115e7e1
diff --git a/luni/src/main/java/java/util/zip/ZipEntry.java b/luni/src/main/java/java/util/zip/ZipEntry.java index 1be00d8..ee68b66 100644 --- a/luni/src/main/java/java/util/zip/ZipEntry.java +++ b/luni/src/main/java/java/util/zip/ZipEntry.java
@@ -358,24 +358,24 @@ } it.seek(8); - int gpbf = it.readShort(); + int gpbf = it.readShort() & 0xffff; if ((gpbf & ZipFile.GPBF_UNSUPPORTED_MASK) != 0) { throw new ZipException("Invalid General Purpose Bit Flag: " + gpbf); } - compressionMethod = it.readShort(); - time = it.readShort(); - modDate = it.readShort(); + compressionMethod = it.readShort() & 0xffff; + time = it.readShort() & 0xffff; + modDate = it.readShort() & 0xffff; // These are 32-bit values in the file, but 64-bit fields in this object. crc = ((long) it.readInt()) & 0xffffffffL; compressedSize = ((long) it.readInt()) & 0xffffffffL; size = ((long) it.readInt()) & 0xffffffffL; - nameLength = it.readShort(); - int extraLength = it.readShort(); - int commentByteCount = it.readShort(); + nameLength = it.readShort() & 0xffff; + int extraLength = it.readShort() & 0xffff; + int commentByteCount = it.readShort() & 0xffff; // This is a 32-bit value in the file, but a 64-bit field in this object. it.seek(42);
diff --git a/luni/src/main/java/java/util/zip/ZipFile.java b/luni/src/main/java/java/util/zip/ZipFile.java index c1f2f5c..c5c04f8 100644 --- a/luni/src/main/java/java/util/zip/ZipFile.java +++ b/luni/src/main/java/java/util/zip/ZipFile.java
@@ -279,7 +279,7 @@ // http://www.pkware.com/documents/casestudies/APPNOTE.TXT RAFStream rafStream= new RAFStream(localRaf, entry.localHeaderRelOffset + 6); DataInputStream is = new DataInputStream(rafStream); - int gpbf = Short.reverseBytes(is.readShort()); + int gpbf = Short.reverseBytes(is.readShort()) & 0xffff; if ((gpbf & ZipFile.GPBF_UNSUPPORTED_MASK) != 0) { throw new ZipException("Invalid General Purpose Bit Flag: " + gpbf); } @@ -287,7 +287,7 @@ // At position 28 we find the length of the extra data. In some cases // this length differs from the one coming in the central header. is.skipBytes(20); - int localExtraLenOrWhatever = Short.reverseBytes(is.readShort()); + int localExtraLenOrWhatever = Short.reverseBytes(is.readShort()) & 0xffff; is.close(); // Skip the name and this "extra" data or whatever it is: