From ac16122816cc74ce1067b96f8d51612117d47b0c Mon Sep 17 00:00:00 2001 From: William Luh Date: Wed, 17 Apr 2013 10:45:48 -0700 Subject: Only enforce the encrypted bit in the GPBF, and ignore other unsupported bits. (cherry-pick of 7a302a49a7c8b99e2f34fff660e199fb7c776bc1.) Bug: 8617715 Change-Id: Ibfe919d67fd17cee050d23811faa5aa64116dfb4 --- luni/src/main/java/java/util/zip/ZipEntry.java | 2 +- luni/src/main/java/java/util/zip/ZipFile.java | 16 +++++++++++++--- luni/src/main/java/java/util/zip/ZipInputStream.java | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/luni/src/main/java/java/util/zip/ZipEntry.java b/luni/src/main/java/java/util/zip/ZipEntry.java index 6dd9839..fbd477d 100644 --- a/luni/src/main/java/java/util/zip/ZipEntry.java +++ b/luni/src/main/java/java/util/zip/ZipEntry.java @@ -368,7 +368,7 @@ public class ZipEntry implements ZipConstants, Cloneable { it.seek(8); int gpbf = it.readShort(); - if ((gpbf & ~ZipFile.GPBF_SUPPORTED_MASK) != 0) { + if ((gpbf & ZipFile.GPBF_UNSUPPORTED_MASK) != 0) { throw new ZipException("Invalid General Purpose Bit Flag: " + gpbf); } diff --git a/luni/src/main/java/java/util/zip/ZipFile.java b/luni/src/main/java/java/util/zip/ZipFile.java index 1a77e6c..5182f88 100644 --- a/luni/src/main/java/java/util/zip/ZipFile.java +++ b/luni/src/main/java/java/util/zip/ZipFile.java @@ -48,6 +48,12 @@ import libcore.io.Streams; */ public class ZipFile implements ZipConstants { /** + * General Purpose Bit Flags, Bit 0. + * If set, indicates that the file is encrypted. + */ + static final int GPBF_ENCRYPTED_FLAG = 1 << 0; + + /** * General Purpose Bit Flags, Bit 3. * If this bit is set, the fields crc-32, compressed * size and uncompressed size are set to zero in the @@ -70,9 +76,13 @@ public class ZipFile implements ZipConstants { /** * Supported General Purpose Bit Flags Mask. - * Bit mask of supported GPBF bits. + * Bit mask of bits not supported. + * Note: The only bit that we will enforce at this time + * is the encrypted bit. Although other bits are not supported, + * we must not enforce them as this could break some legitimate + * use cases (See http://b/8617715). */ - static final int GPBF_SUPPORTED_MASK = GPBF_DATA_DESCRIPTOR_FLAG | GPBF_UTF8_FLAG; + static final int GPBF_UNSUPPORTED_MASK = GPBF_ENCRYPTED_FLAG; /** * Open zip file for reading. @@ -255,7 +265,7 @@ public class ZipFile implements ZipConstants { RAFStream rafStream= new RAFStream(raf, entry.mLocalHeaderRelOffset + 6); DataInputStream is = new DataInputStream(rafStream); int gpbf = Short.reverseBytes(is.readShort()); - if ((gpbf & ~ZipFile.GPBF_SUPPORTED_MASK) != 0) { + if ((gpbf & ZipFile.GPBF_UNSUPPORTED_MASK) != 0) { throw new ZipException("Invalid General Purpose Bit Flag: " + gpbf); } diff --git a/luni/src/main/java/java/util/zip/ZipInputStream.java b/luni/src/main/java/java/util/zip/ZipInputStream.java index 319a0fa..9a9ecec 100644 --- a/luni/src/main/java/java/util/zip/ZipInputStream.java +++ b/luni/src/main/java/java/util/zip/ZipInputStream.java @@ -240,7 +240,7 @@ public class ZipInputStream extends InflaterInputStream implements ZipConstants throw new ZipException("Cannot read local header version " + version); } int flags = peekShort(LOCFLG - LOCVER); - if ((flags & ~ZipFile.GPBF_SUPPORTED_MASK) != 0) { + if ((flags & ZipFile.GPBF_UNSUPPORTED_MASK) != 0) { throw new ZipException("Invalid General Purpose Bit Flag: " + flags); } -- cgit v1.1