Code review request 7183373: URLClassloader.close() does not close JAR files whose resources have been loaded via getResource()

Frank Ding dingxmin at linux.vnet.ibm.com
Thu Jan 17 22:54:58 PST 2013


Hi Michael,
   Could you please take a look at my comment below?

Best regards,
Frank

On 1/6/2013 4:23 PM, Frank Ding wrote:
> Hi Michael,
>   After reading carefully discussion thread, let me elaborate my 
> investigation and conclusion.
>   The 2nd version of Shirish's patch tries to address your concern 
> that "Would it be possible to fix this within the context of whatever 
> loader is currently being invoked?".  The new solution sticks to using 
> Loader rather than JarLoader.
>   The call cl.close() in the jtreg test case, according to its spec 
> (URLClassLoader.close) should "close any files that were opened by it 
> in case of jar".  Its implementation code shows it closes any opened 
> resources through api such as getResourceAsStream invoked by client 
> code but doesn't take care of any resources opened by 
> findResource(String) or findResources(String).  This implies that 
> findResource should return any resource found but should not leave it 
> in open state. The key issue for a Loader.findResource() when 
> searching within a jar file does not follow this rule because the code 
> combination "InputStream is = url.openStream(); is.close();" (in 
> URLClassPath.Loader.findResource()) leaves the jar file in open 
> state.  As Shirish pointed out, if useCaches is set to true, the 
> problem is gone.  It can be easily verified from code 
> JarURLInputStream.close() defined in JarURLConnection.java.
>   My conclusion is that Shirish's first patch is reasonable (except 
> the constructor change which I have not fully understood yet) because 
> choosing a JarLoader avoids unclosed resources after calling 
> URLClassLoader.getResource() and 2nd patch also makes sense as 
> explained above.  The ramifications of these 2 patches need deliberate 
> considerations but we still have to fix the issue after weighing their 
> risks.  Could you please shed your light on it?
>
>   Best regards,
>   Frank
>
> On 8/25/2012 12:02 AM, Shirish Kuncolienkar wrote:
>> On 8/24/2012 5:39 PM, Michael McMahon wrote:
>>> On 23/08/12 18:50, Shirish Kuncolienkar wrote:
>>>> Could I get the change reviewed please
>>>>
>>>> This behavior is seen on Windows.
>>>> Logic in URLClassPath.getLoader() does not take care of an URL 
>>>> which looks like "jar:file:/C:/test/xyz.jar!/". The logic ends up 
>>>> choosing a FileLoader instead of a JarLoader. JarLoader has 
>>>> provision for closing file handles, so choosing a JarLoader will 
>>>> solve the problem. Secondly the constructor of JarLoader blindly 
>>>> adds a prefix and suffix to the provided URL to make it look like a 
>>>> jar URL. Changed the code here to conditionally append/prepend
>>>>
>>>> The change set can be found at 
>>>> http://cr.openjdk.java.net/~shirishk/7183373/webrev.0/
>>>>
>>>> -Shirish
>>>>
>>> Shirish,
>>>
>>> I have a slight concern that this would modify the Loader class to 
>>> be used in some circumstances
>>> completely independent of the requirements of 
>>> URLClassLoader.close(). This is very sensitive code.
>>> Would it be possible to fix this within the context of whatever 
>>> loader is currently being invoked?
>>>
>>> - Michael
>>>
>> Michael,
>>
>> Thanks for the review comments.  The second version of the fix is 
>> uploaded at http://cr.openjdk.java.net/~shirishk/7183373/webrev.2/
>> Could you please take a look at this one ?
>>
>> Description of the fix:
>> URLClassPath.Loader.findResource() method opens a connection to the 
>> provided URL to test whether the URL is good.  Here the Jar file gets 
>> opened but does not get closed because the created stream as 
>> setUseCaches set to true.
>>
>> Just out of curiosity I would like to know bit more on "some 
>> circumstances completely independent of the requirements of 
>> URLClassLoader.close()".  I see that the Loader classes are private 
>> in nature and are being used within the context of the URLClassPath.
>> We create an instance of JarLoader for all the jars that are on the 
>> extension class loader path by adding "jar" ,  "!/" to the file url 
>> which comes as the input.  The reason behind the first fix was that 
>> if we have a url like this why not use a JarLoader instance.
>>
>> - Shirish
>>
>




More information about the net-dev mailing list