On Mar 27, 2013, at 8:01 PM, Mandy Chung <mandy.ch...@oracle.com> wrote:

> Thanks for the review.  I forgot to mention that Chris contributed the 
> initial patch (thanks).
> 
> On 3/27/2013 1:13 PM, Christian Thalinger wrote:
>> On Mar 27, 2013, at 10:35 AM, Mandy Chung <mandy.ch...@oracle.com> wrote:
>> 
>>> This is the JDK change for JEP 176: JEP 176: Mechanical Checking of 
>>> Caller-Sensitive Methods [1].  Christian has posted the webrev for the 
>>> hotspot VM change a couple weeks ago [2].
>>> 
>>> Webrev at:
>>> http://cr.openjdk.java.net/~mchung/jdk8/webrevs/7198429/webrev.00/
>> src/share/classes/java/lang/ClassLoader.java:
>> 
>> +    static void checkClassLoaderPermission(ClassLoader cl, Class<?> caller) 
>> {
>> 
>> I think we should rename that method to:
>> 
>> +    static void checkGetClassLoaderPermission(ClassLoader cl, Class<?> 
>> caller) {
> 
> I think checkClassLoaderPermission and needsClassLoaderPermissionCheck are 
> just fine.  I'd like to keep it as it is not to make the method name too long.
> 
>> src/share/classes/java/lang/invoke/MethodHandleImpl.java:
>> 
>> +        @sun.reflect.CallerSensitive
>> +            Class<?> actual = sun.reflect.Reflection.getCallerClass();
>> 
>> Why are we not using imports here?
> 
> imports are for convenience and ease of development.  For only one reference,

Well, it's actually two ;-)  I was thinking about people grep'ing for 
@CallerSensitive and not getting a hit on this one.  Just a suggestion.

> I don't see any difference to import or not.
> 
>> src/share/classes/java/util/logging/Logger.java:
>> 
>>              // 0: Reflection 1: Logger.demandLogger 2: Logger.getLogger 3: 
>> caller
>>              final int SKIP_FRAMES = 3;
>> 
>> Please remove these lines as well.
> 
> Removed.  Thanks for catching the leftover comment.
>> src/share/native/sun/reflect/Reflection.c:
>> 
>> Could you put back this comment:
>> 
>> +     // Let's do at least some basic handshaking:
>> +     const int depth = -1;
>> 
>> It makes it clearer why it's -1.
> 
> I added this comment:
>  32     // with the presence of @CallerSensitive annotation,
>  33     // JVM_GetCallerClass asserts depth == -1 as the basic handshaking

Thanks.

> 
>> test/sun/reflect/GetCallerClass.sh:
>> 
>> Could you please don't use a shell script to copy the class file?
> 
> The shell test doesn't do a copy.  It compiles the source file in a separate 
> directory that will be specified in -Xbootclasspath/a option in javac and 
> java commands.
> 
> jtreg in the code-tool repo has added the bootclasspath support:
>    http://hg.openjdk.java.net/code-tools/jtreg/rev/98387c9f36e3
> 
> You can specify in the @run tag:
>    @run main/bootclasspath opt class
> 
> This will be a better way to run a test on the bootclasspath.

That's great.

> 
>> For example this test:
>> 
>> http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/tip/test/compiler/whitebox/DeoptimizeAllTest.java
>> 
>> does the same thing using a little Java program ClassFileInstaller:
>> 
>> http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/tip/test/testlibrary/ClassFileInstaller.java
> 
> This is a nice workaround to avoid shell tests.  It compiles the source file 
> in $TESTCLASSES and copies the one in a different location (dest) that will 
> be used in a @run main -Xbootclasspath/a:dest class.
> 
> I prefer to use the new jtreg bootclasspath support when it's released rather 
> than adding yet another workaround to avoid shell tests.   We should replace 
> many, if not all, existing shell tests that currently put classes in the 
> bootclasspath with the jtreg bootclasspath support in one patch.  I keep the 
> test as it is.

I take your word for it that you will remove it.  Checking back in a year... :-)

-- Chris

> 
> Mandy
> 
>> -- Chris
>> 
>>> While it touches many files, the fix is simple and straight-forward for 
>>> review.
>>> 
>>> This fix annotates all methods that call Reflection.getCallerClass() method 
>>> with @sun.reflect.CallerSensitive annotation so that it enables the VM to 
>>> reliably enforce that methods looking up its immediate caller class are 
>>> marked as caller-sensitive. The JVM will set a new caller-sensitive bit 
>>> when resolving a MemberName and 
>>> java.lang.invoke.MethodHandleNatives.isCallerSensitive is upgraded to query 
>>> it directly.
>>> The hand-maintained method list in MethodHandleNatives is removed.
>>> 
>>> A couple things to mention:
>>> 1. I am working on a fix for 8007035 that proposes to deprecate 
>>> SecurityManager.checkMemberAccess method as it requires the caller’s frame 
>>> to be at a stack depth of four, which is fragile and difficult to enforce.
>>> 
>>> 2. NashornScriptEngineFactory.getAppClassLoader()
>>> 
>>> The change is to workaround the issue until 8009783 is resolved.
>>> 
>>> The current implementation walks the stack to find the classloader of the 
>>> user context that NashornScriptEngine is running on which is fragile.  Also 
>>> other script engine implementations may require similiar capability.  
>>> 8009783 has been filed to revisit the scripting API to pass the user 
>>> "context" to the script engine rather than relying the implementation to 
>>> find it magically.
>>> 
>>> Thanks
>>> Mandy
>>> 
>>> [1] http://openjdk.java.net/jeps/176
>>> [2] 
>>> http://mail.openjdk.java.net/pipermail/hotspot-dev/2013-March/008915.html
> 

Reply via email to