RFC: 8132359: JarURLConnection.getJarFile() resource leak when file is not found
Michael McMahon
michael.x.mcmahon at oracle.com
Wed May 6 12:11:54 UTC 2020
Hi,
Yes, we've had some discussion about it internally, and while others may
yet have an opinion, I think this approach is a reasonable one, with a
spec change
that captures the behavior.
The main thing we need to capture is that while connect() to a non
existing resource
may fail, getJarFile() can still return a reference to the containing
JAR file if that is accessible.
There could be other subtleties like what happens if the JAR file is not
accessible,
is null a reasonable return value in that case? I think that could
happen and might
need to be specified.
Michael.
On 01/05/2020 10:32, Alex Kashchenko wrote:
> Hi,
>
> Pinging politely about this issue.
>
> I wonder whether it would be appropriate to file a CSR about
> getJarFile() behaviour change at this point?
>
> Concise description of the change is:
>
> "So should the getJarFile return be a reference to JarFile for an URL
> specifying an non existent entry i.e. the resource doesn't exist?"
>
>
> On 04/02/2020 12:14 AM, mark sheppard wrote:
>> p.s.
>>
>> I had also meant to say in the response below, that the proposed
>> getJaFile solution is
>> perfectly reasonable and would allow a recoverable strategy in an
>> related
>> scenario where a URLConnection:: connect, for the same type of entry
>> URL,
>> throws a FNFException resulting in the same type of "resource leak".
>> But, in this case, with the proposed change the JarFile can be
>> retrieved and closed.
>>
>> regards
>> Mark
>>
>>
>>
>> ________________________________
>> From: net-dev <net-dev-bounces at openjdk.java.net> on behalf of mark
>> sheppard <macanaoire at hotmail.com>
>> Sent: Wednesday 1 April 2020 16:03
>> To: Michael McMahon <michael.x.mcmahon at oracle.com>; Alex Kashchenko
>> <akashche at redhat.com>
>> Cc: Mark Sheppard <mark.sheppard at oracle.com>;
>> net-dev at openjdk.java.net >> OpenJDK Network Dev list
>> <net-dev at openjdk.java.net>
>> Subject: Re: RFC: 8132359: JarURLConnection.getJarFile() resource
>> leak when file is not found
>>
>> Hi Michael et al.,
>> just looking at the webrev ... the change in URLClassPath seems
>> reasonable.
>> The change in JarURLConnection has implications and would change the
>> semantics of
>> the getJarFile method.
>>
>> using the example accompanying this JBS item to demonstrate an issue
>> caused by the caching mechanism
>> within the URLConnection framework, it should be noted that the jar
>> URL is referencing
>> an non existent entry in the jar file entry. Thus some form of
>> exception would be anticipated in this scenario.
>>
>> With the proposed change, this will return a JarFile regardless of
>> whether a referenced resource (URL) exists or not.
>>
>> Examining the call flows it can be observed that
>> the getJarFile invokes connect. This will retrieve a jar file via
>> JarFileFactory
>> and then, because the URL references an entry in the jar file,
>> attempts
>> to access the entry resulting in a null return, which generates a
>> FNF exception to be thrown.
>>
>> Also note that an explicit invocation of connect on the
>> JarURLConnection instance will result in the FNFException.
>>
>> the change in the JarURLConnection will return a jar file in this
>> test scenario and not the FNF exception. Based on the methods
>> spec is that acceptable behaviour change?
>>
>>
>> public abstract JarFile getJarFile throws IOException
>>
>> Return the JAR file for this connection.
>>
>> Returns:
>> the JAR file for this connection. If the connection is a connection
>> to an entry of a JAR file, the JAR file object is returned
>> Throws:
>> IOException<https://docs.oracle.com/javase/7/docs/api/java/io/IOException.html>
>> - if an IOException occurs while trying to connect to the JAR file
>> for this connection.
>> See Also:
>> URLConnection.connect()<https://docs.oracle.com/javase/7/docs/api/java/net/URLConnection.html#connect()>
>>
>> and connect says
>> "Opens a communications link to the resource referenced by this URL,
>> if such a connection has not already been established."
>>
>> So should the getJarFile return be a reference to JarFile for an URL
>> specifying an non existent entry i.e. the resource doesn't exist?
>> Is the resource associated with a JarURLConnection the encapsulated
>> JarFile? Or the target in the specified in the URL ?
>>
>> There are a series of similar behaviour anomalies in this area
>> URL/URLConnection/JarURLConnection (on Windows) and in general they
>> can be attributed to the internal caching mechanism, which is
>> enabled OOTB, and its impact on the closing of file resource in
>> Exception conditions scenarios.
>>
>> Disabling caching for jar protocol , which will allow consistent and
>> correct behaviour is one possibility.
>>
>> As such an alternative or workaround is to disable caching for the
>> jar protocol
>> via the URLConnection::setDefaultUseCaches() on Windows where an
>> application
>> may want to delete a jar file resource, for example:
>>
>> URLConnection.setDefaultUseCaches("jar", false);
>>
>> best regards
>> Mark
>>
>> ________________________________
>> From: net-dev <net-dev-bounces at openjdk.java.net> on behalf of Michael
>> McMahon <michael.x.mcmahon at oracle.com>
>> Sent: Monday 16 March 2020 12:39
>> To: Alex Kashchenko <akashche at redhat.com>
>> Cc: net-dev at openjdk.java.net >> OpenJDK Network Dev list
>> <net-dev at openjdk.java.net>
>> Subject: Re: RFC: 8132359: JarURLConnection.getJarFile() resource
>> leak when file is not found
>>
>> Hi Alex,
>>
>> (and redirecting the thread to net-dev)
>>
>> It looks like a straight forward solution and perhaps the
>> compatibility test
>> could be challenged on the basis of reliance on implementation behavior
>> rather than the spec.
>>
>> But, more important I think is the behavior change of the fix itself and
>> that will require
>> careful review which we can't commit to immediately. We will try and get
>> back to you
>> about it in a week or so.
>>
>> Thanks,
>>
>> Michael.
>>
>> On 14/03/2020 00:08, Alex Kashchenko wrote:
>>> Hi,
>>>
>>> Based on these maillist threads:
>>>
>>> https://mail.openjdk.java.net/pipermail/core-libs-dev/2020-March/065076.html
>>>
>>>
>>> https://mail.openjdk.java.net/pipermail/core-libs-dev/2019-November/063643.html
>>>
>>>
>>>
>>> I am looking for comments and suggestions, whether the following
>>> change to JarURLConnection.getJarFile() behaviour may be acceptable:
>>>
>>> If, during connect() call, jarFile itself was created successfully,
>>> but access to (non-existent) jarEntry failed - return this jarFile to
>>> caller instead of throwing exception.
>>>
>>> bug: https://bugs.openjdk.java.net/browse/JDK-8132359
>>> webrev: http://cr.openjdk.java.net/~akasko/jdk/8132359/webrev.00/
>>>
>>> This change also allows to fix JDK-8232854 with the minimal change to
>>> URLClassPath (included with the patch).
>>>
>>> This change doesn't cause regression failures in java/net.
>>>
>>> This change causes one compatibility failure, when getManifest()
>>> doesn't throw expected IOException when URL points to non-existent
>>> class inside JAR.
>>>
>>
>
>
More information about the net-dev
mailing list