Uploaded image for project: 'Harmony'
  1. Harmony
  2. HARMONY-4150

[classlib][archive]RI could read some bytes from an InputStream even if the jar file has been closed

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Won't Fix
    • None
    • None
    • None

    Description

      refer to HARMONY-2436

      === TestJarFileClose.java:
      import java.util.jar.*;
      import java.io.*;

      public class TestJarFileClose{

      public static void main(String[] args) {
      byte[] b = new byte[4];
      int cnt = 0;

      try {
      JarFile jf = new JarFile("ecj_3.3M7.jar");
      InputStream is = jf.getInputStream(jf.getEntry(
      "org/eclipse/jdt/internal/compiler/ClassFile.class"));
      int r;

      // attention! fill the internal buffer?
      if (System.getProperty("initial.read") != null)

      { r = is.read(b, 0, 4); }

      jf.close();

      while (true) {
      r = is.read(b, 0, 1);

      if (r != -1)

      { cnt += r; }

      else

      { break; }


      }
      is.close();
      } catch (Exception e)

      { e.printStackTrace(); }


      System.out.println("Bytes red after file closure: " + cnt);
      }
      }
      ===

      CMD: java TestJarFileClose
      OUTPUT:
      java.util.zip.ZipException: ZipFile closed
      at java.util.zip.ZipFile.ensureOpenOrZipException(ZipFile.java:524)
      at java.util.zip.ZipFile.access$1400(ZipFile.java:35)
      at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:556)
      at java.util.zip.ZipFile$2.fill(ZipFile.java:338)
      at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:134)
      at TestJarFileClose.main(TestJarFileClose.java:24)
      Bytes red after file closure: 0

      CMD: java -Dinitial.read TestJarFileClose
      OUTPUT:
      java.util.zip.ZipException: ZipFile closed
      at java.util.zip.ZipFile.ensureOpenOrZipException(ZipFile.java:524)
      at java.util.zip.ZipFile.access$1400(ZipFile.java:35)
      at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:556)
      at java.util.zip.ZipFile$2.fill(ZipFile.java:338)
      at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:134)
      at TestJarFileClose.main(TestJarFileClose.java:24)
      Bytes red after file closure: 24968

      To run this test you need to put "ecj_3.3M7.jar" in the directory where the test class is located. The test shows that RI maintains some internal buffer and if this buffer is initialized and filled by reading some data from stream then ZipException is thrown only after reading 24968 bytes - probably after the buffer is exhausted and new read attempt is performed. AFAIU current Harmony implementation tries to allocate enough bytes to keep complete ZipEntry in memory without using any fixed-size buffer - see Java_java_util_zip_ZipFile_inflateEntryImpl2() in the file "zip.c".

      I am not sure if we should try to refactor our code to completely follow RI here. It can appear to be a non-trivial fix.

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              tony.wu Tony Wu
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: