Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6374379

ZipFile class cannot open zip files with long filenames

XMLWordPrintable

    • b86
    • generic, x86
    • generic, windows_nt, windows_2000, windows_xp

        OPERATING SYSTEM(S):
        Windows

        FULL JDK VERSION(S):
        java version "1.5.0_06"
        Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
        Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)

        DESCRIPTION:
        Sunbug 6182812 allowed unicode and long filenames within Java classes including FileOutputStream.

        java.util.zip.ZipFile remains unable to cope with long filenames on both Java 1.5 u06, and 1.6 b65.

        I think that this is related to 6329168 "new ZipFile(name) fails on Windows when name contains non-Latin1".

        E:\long_filenames_in_zip>java -version
        java version "1.5.0_06"
        Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
        Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)

        E:\long_filenames_in_zip>java TestLongJarName
        Test failed - problem reading the Jar file back in.
        java.util.zip.ZipException: Filename too long
                at java.util.zip.ZipFile.open(Native Method)
                at java.util.zip.ZipFile.<init>(ZipFile.java:203)
                at java.util.zip.ZipFile.<init>(ZipFile.java:234)
                at ReadLongNameZipFile.main(ReadLongNameZipFile.java:43)

        You can verify that the long filename is causing the problem by reducing the value of
        minRequiredLength in the attached testcase. The test passes with a smaller number like 30.

        //-- Testcase: -------
        import java.io.*;
        import java.util.jar.*;
        import java.util.zip.*;

        public class ReadLongNameZipFile {
        public static void main (String args[]) {
        String longDirName = "abcdefghijklmnopqrstuvwx"; // 24 chars.
        String jarFileName = "areallylargejarfilename.jar"; // 27 chars.
        File file = null;
        File myJarFile = null;
        int currentFileLength = 0;
        int minRequiredLength = 300; // try something big enough to definitely fail.

        String sb = "."+File.separator;
        try {
        // create a directory structure long enough that the filename will put us over the minRequiredLength
        do {
        sb=sb+longDirName+File.separator;
        file = new File(sb);
        file.mkdir();
        currentFileLength = file.getCanonicalPath().length();
        file.deleteOnExit();
        } while (currentFileLength < (minRequiredLength - jarFileName.length()));
        // create a new Jar file - this passes OK
        sb=sb+jarFileName;
        FileOutputStream destJar = new FileOutputStream(sb.toString());
        JarOutputStream out = new JarOutputStream(new BufferedOutputStream(destJar));
        JarEntry jarEntry = new JarEntry("testFile.txt");
        out.putNextEntry(jarEntry);
        out.write(1);
        out.close();
        myJarFile = new File(sb.toString());
        currentFileLength = myJarFile.getCanonicalPath().length();
        if(!myJarFile.exists()) {
        System.err.println("Jar file does not exist.");
        }
        } catch (IOException e) {
        System.err.println("Problem creating the Jar file.");
        e.printStackTrace();
        }
        try {
        // create a new ZipFile object (also fails with JarFile - a subclass of ZipFile) using the myJarFile File object...
        ZipFile readJarFile = new ZipFile(myJarFile);
        readJarFile.close();
        System.out.println("Test passed - opened Jar file for reading with a name "+currentFileLength+" characters long!");
        } catch (IOException e) {
        System.err.println("Test failed - problem reading the Jar file back in.");
        e.printStackTrace();
        } finally {
        // clean up a bit
        if(myJarFile!=null) {
        if(myJarFile.exists()) {
        if(!myJarFile.delete()) {
        System.err.println("Jar file cannot be deleted.");
        }
        }
        if(file.exists()) {
        if(!file.delete()) {
        System.err.println("Directory structure cannot be deleted.");
        }
        }
        }
        }
        }
        }
        //-----------------------

              bristor Dave Bristor (Inactive)
              elarsen Erik Larsen (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: