GoogleGit

commit9edf43dfcc35c761d97eb9156ac4254152ddbc55[log][tgz]
authorElliott Hughes <enh@google.com>Wed Jul 03 16:23:31 2013 -0700
committerElliott Hughes <enh@google.com>Wed Jul 03 16:23:31 2013 -0700
tree3967339bf6af13fb6a8ea5aa2b24245b2c13874d
parent10d1f630d8df0064ed966193fa8c9d10a96a8321[diff]
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: