--- a/jdk/src/share/classes/java/util/zip/ZipFile.java Fri Apr 05 10:17:06 2013 -0400
+++ b/jdk/src/share/classes/java/util/zip/ZipFile.java Mon Apr 08 06:15:18 2013 +0100
@@ -54,9 +54,10 @@
*/
public
class ZipFile implements ZipConstants, Closeable {
- private long jzfile; // address of jzfile data
- private String name; // zip file name
- private int total; // total number of entries
+ private long jzfile; // address of jzfile data
+ private final String name; // zip file name
+ private final int total; // total number of entries
+ private final boolean locsig; // if zip file starts with LOCSIG (usually true)
private volatile boolean closeRequested = false;
private static final int STORED = ZipEntry.STORED;
@@ -216,6 +217,7 @@
sun.misc.PerfCounter.getZipFileCount().increment();
this.name = name;
this.total = getTotal(jzfile);
+ this.locsig = startsWithLOC(jzfile);
}
/**
@@ -737,10 +739,28 @@
}
}
+ static {
+ sun.misc.SharedSecrets.setJavaUtilZipFileAccess(
+ new sun.misc.JavaUtilZipFileAccess() {
+ public boolean startsWithLocHeader(ZipFile zip) {
+ return zip.startsWithLocHeader();
+ }
+ }
+ );
+ }
+
+ /**
+ * Returns {@code true} if, and only if, the zip file begins with {@code
+ * LOCSIG}.
+ */
+ private boolean startsWithLocHeader() {
+ return locsig;
+ }
private static native long open(String name, int mode, long lastModified,
boolean usemmap) throws IOException;
private static native int getTotal(long jzfile);
+ private static native boolean startsWithLOC(long jzfile);
private static native int read(long jzfile, long jzentry,
long pos, byte[] b, int off, int len);