src/share/classes/java/util/zip/ZipFile.java
Print this page
@@ -34,10 +34,12 @@
import java.util.Vector;
import java.util.Enumeration;
import java.util.Set;
import java.util.HashSet;
import java.util.NoSuchElementException;
+import java.security.AccessController;
+import sun.security.action.GetPropertyAction;
import static java.util.zip.ZipConstants64.*;
/**
* This class is used to read entries from a zip file.
*
@@ -76,10 +78,21 @@
initIDs();
}
private static native void initIDs();
+ private static final boolean usemmap;
+
+ static {
+ // A system prpperty to disable mmap use to avoid vm crash when
+ // in-use zip file is accidently overwritten by others.
+ String prop = AccessController.doPrivileged(
+ new GetPropertyAction("sun.zip.disableMemoryMapping"));
+ usemmap = (prop == null ||
+ !(prop.length() == 0 || prop.equalsIgnoreCase("true")));
+ }
+
/**
* Opens a zip file for reading.
*
* <p>First, if there is a security manager, its <code>checkRead</code>
* method is called with the <code>name</code> argument as its argument
@@ -194,11 +207,11 @@
}
if (charset == null)
throw new NullPointerException("charset is null");
this.zc = ZipCoder.get(charset);
long t0 = System.nanoTime();
- jzfile = open(name, mode, file.lastModified());
+ jzfile = open(name, mode, file.lastModified(), usemmap);
sun.misc.PerfCounter.getZipFileOpenTime().addElapsedTimeFrom(t0);
sun.misc.PerfCounter.getZipFileCount().increment();
this.name = name;
this.total = getTotal(jzfile);
}
@@ -671,12 +684,12 @@
}
}
}
- private static native long open(String name, int mode, long lastModified)
- throws IOException;
+ 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 int read(long jzfile, long jzentry,
long pos, byte[] b, int off, int len);
// access to the native zentry object