RFC: 8132359: JarURLConnection.getJarFile() resource leak when file is not found
Alex Kashchenko
akashche at redhat.com
Fri May 1 09:32:37 UTC 2020
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.
>>
>
--
-Alex
More information about the net-dev
mailing list