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