harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tony Wu" <wuyue...@gmail.com>
Subject Re: [jira] Commented: (HARMONY-2436) [classlib][archive] Reading from a closed Jar file is allowed
Date Thu, 07 Jun 2007 07:59:01 GMT
Hi,
Seems RI cached some bytes, which can be read even if the jarfile has
been closed. I wonder what's your opinion about that? should we follow
RI to cache the bytes and should we use the buffer size the same as
RI?

On 5/30/07, Alexei Zakharov (JIRA) <jira@apache.org> wrote:
>
>    [ https://issues.apache.org/jira/browse/HARMONY-2436?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12500084
]
>
> Alexei Zakharov commented on HARMONY-2436:
> ------------------------------------------
>
> Hi Tony, thanks for the patch. But it looks like RI's behavior is more tricky indeed.
Try to look at the following test:
>
> === 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.
>
> > [classlib][archive] Reading from a closed Jar file is allowed
> > -------------------------------------------------------------
> >
> >                 Key: HARMONY-2436
> >                 URL: https://issues.apache.org/jira/browse/HARMONY-2436
> >             Project: Harmony
> >          Issue Type: Bug
> >          Components: Classlib
> >            Reporter: Anton Ivanov
> >            Assignee: Alexei Zakharov
> >            Priority: Minor
> >         Attachments: harmony-2436.diff, hello_world.jar
> >
> >
> > Reading from InputStream which was opened on some JarFile
> > is allowed even if this JarFile was closed .
> > java.util.jar.JarFile inherits close() method from java.util.zip.ZipFile and
> > specification of this method ensure that if JarFile is closed all InputStreams that
were obtained
> > via getInputStream() method will be closed. But JarFile behaves in a different manner.
> > Code to reproduce this problem:
> > import java.util.jar.*;
> > import java.io.*;
> > public class TestJarFileClose{
> >     public static void main(String[] args) {
> >         byte[] b = new byte[1024];
> >         try {
> >             JarFile jf = new JarFile("hello_world.jar");
> >             InputStream is = jf.getInputStream(jf.getEntry("hello_world/HelloWorld.class"));
> >             jf.close();
> >             int r = is.read(b, 0, 1024);
> >             System.out.println("Test failed, readed from closed JAR file: "+r);
> >             is.close();
> >         } catch (Exception e) {
> >             System.out.println("Test passed: "+e);
> >         }
> >     }
> > }
> > Output on RI:
> > Test passed: java.lang.IllegalStateException: zip file closed
> > Output on Harmony:
> > Test failed, readed from closed JAR file: 427
>
> --
> This message is automatically generated by JIRA.
> -
> You can reply to this email to add a comment to the issue online.
>
>


-- 
Tony Wu
China Software Development Lab, IBM

Mime
View raw message