On Tue, 8 Feb 2022 18:06:04 GMT, Lance Andersen <lan...@openjdk.org> wrote:

>>> ze can't be null here.
>> 
>> Actually it can be:  Consider the following:
>> 
>> 
>>         try (JarFile jf = new JarFile(SIGNED_VALID_ENTRY_NAME_JAR.toFile(), 
>> true)) {
>>             var ze = new ZipEntry("org/gotham/Batcave.class");
>>             var ex= expectThrows(ZipException.class,
>>                     () -> jf.getInputStream(ze) );
>>             // Validate that we receive the expected message from
>>             // JarFile::verifiableEntry when ZipEntry::getName returns null
>>             assertTrue( ex != null && ex.getMessage().equals("Error: 
>> ZipEntry should not be null!"));
>>         }
>> 
>> 
>> The above code does generate the error.
>
>> Nit, add space after "if"
> 
> will fix

So a bit more on this.  If the ZipEntry passed to `ZipFile::getInputStream` 
does not represent an entry within the current Zip/Jar,  
`ZipFile::getInputStream` will return a null for the InputStream:


    @Test
    public static void ZipFileZipEntryNullGetInputStreamTest() throws Exception 
{
        try (ZipFile zf = new ZipFile(VALID_ENTRY_NAME_JAR.toFile())) {
            var ze = new ZipEntry("org/gotham/Batcave.class");
            var is = zf.getInputStream(ze);
            // As the ZipEntry cannot be found, the returned InpuStream is null
            assertNull(is);
        }
    }


  JarFile::getInputStream will also return null when the jar is not signed or 
we are not verifying the jar:


 @Test
    public static void JarFileZipEntryNullGetInputStreamTest() throws Exception 
{
        try (JarFile jf = new JarFile(VALID_ENTRY_NAME_JAR.toFile())) {
            var ze = new ZipEntry("org/gotham/Batcave.class");
            var is = jf.getInputStream(ze);
            // As the ZipEntry cannot be found, the returned InpuStream is null
            assertNull(is);
        }

        try (JarFile jf = new JarFile(SIGNED_INVALID_ENTRY_NAME_JAR.toFile(), 
false)) {
            var ze = new ZipEntry("org/gotham/Batcave.class");
            var is = jf.getInputStream(ze);
            // As the ZipEntry cannot be found, the returned InpuStream is null
            assertNull(is);
        }
    }



This behavior dates back to at least JDK 1.3

So I think we should return null  instead of throwing an Exception when the 
resulting ZipEntry is null that is returned from the call 
to`JarFile::getJarEntry` (which calls `ZipFile::getEntry`) for consistency with 
ZipFile and when the Jar is not signed or not verified.

I also noticed that `ZipFile::getInputStream` and `JarFile::getInputStream` do 
not mention that a null will be returned if the specified ZipEntry is not found 
within the Jar/Zip.  I guess I could open a CSR as part of this fix to clarify 
this 20+ year behavior.

-------------

PR: https://git.openjdk.java.net/jdk/pull/7348

Reply via email to