RFR: JDK-8210009: Source Launcher classloader should support getResource and getResourceAsStream

Jonathan Gibbons jonathan.gibbons at oracle.com
Wed Sep 5 19:08:11 UTC 2018


Updated webrev, addressing comments from Peter.

1. Fixed protocol string, and updated test to verify that URLs are OK
2. Changed init of the stream handler

Webrev: http://cr.openjdk.java.net/~jjg/8210009/webrev.02/

-- Jon

On 09/05/2018 01:43 AM, Peter Levart wrote:
> Hi Jon,
>
> A few comments at the end...
>
> On 09/04/2018 10:52 PM, Jonathan Gibbons wrote:
>> Please review a change to add support for the getResource* group of 
>> methods
>> to the internal class loader used by the Source Launcher, introduced 
>> in JEP 330.
>>
>> The overall issue has been discussed on OpenJDK lists, [1,2]
>>
>> The implementation consists of providing findResource and findResources,
>> along with a couple of minor additional classes to implement 
>> URLStreamHandler
>> and URLConnection.
>>
>> There is one implementation detail worthy of note. The "new URL" should
>> be inside a doPrivileged block, but overall, the Source Launcher does 
>> not
>> work when a security manager in installed. This is being tracked as 
>> JDK-8210274,
>> and the appropriate doPrivileged call will be added as part of that fix.
>>
>> -- Jon
>>
>> JBS: https://bugs.openjdk.java.net/browse/JDK-8210009
>> Webrev: http://cr.openjdk.java.net/~jjg/8210009/webrev.01/
>
> In the protocol (schema) name:
>
>  618         private final String PROTOCOL = "sourcelauncher_" + 
> getClass().getSimpleName() + hashCode();
>
> ...which looks like "sourcelauncher_MemoryClassLoader-12345", the 
> underscore is not an allowed character. The syntax of schema name is:
>
> alpha *( alpha | digit | "+" | "-" | "." )
>
> URL does not check for that, but when you perform say url.toURI() you 
> get URISyntaxException.
>
> If the intent was to append hashCode() to make the schema name unique 
> per MemoryClassLoader instance (is there a reason for that?), then 
> hashCode() does not guarantee that. Although the probability of a 
> clash is very low.
>
> Was the intent of randomizing protocol name preventing things like 
> making url3 below succeed in returning "wrong" resource?
>
> MemoryClassLoader cl1 = ...
> MemoryClassLoader cl2 = ...
> URL url1 = cl1.getResource(path1);
> URL url2 = cl2.getResource(path2);
>
> URL url3 = new URL(url1, url2.toString());
>
>
> findResource() may be called concurrently from multiple threads, so 
> lazy initialization of 'handler' field should be performed carefully 
> using local variables:
>
>             URLStreamHandler handler = this.handler;
>             if (handler == null) {
>                 this.handler = handler = new MemoryURLStreamHandler();
>             }
>
> ...then use local var 'hander' for constructing URL, or you risk 
> reorderings which might pass null as handler parameter to URL 
> constructor. This is still publication via data race, but should be 
> safe as the only MemoryURLStreamHandler's state is a synthetic final 
> field referencing outer MemoryClassLoader instance.
>
>
> I haven't tried to run the test, but how does this work:
>
>   56         String[] names = {
>   57             "p/q/CLTest.class",
>   58             "p/q/CLTest$Inner.class",
>   59             "p/q/CLTest2.class",
>   60             "java/lang/Object.class",
>   61             "UNKNOWN.class",
>   62             "UNKNOWN"
>   63         };
>
>
> ...and then:
>
>   80             URL u = cl.getResource(name);
>   81             if (u == null) {
>   82                 if (!name.contains("UNKNOWN")) {
>   83                     error("resource not found: " + name);
>   84                 }
>
> Shouldn't resource name "p/q/CLTest2.class" raise an error?
>
>
>
> Regards, Peter
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20180905/43c3df11/attachment-0001.html>


More information about the compiler-dev mailing list