RFR (S) 8181171: Deleting method for RedefineClasses breaks ResolvedMethodName

coleen.phillimore at oracle.com coleen.phillimore at oracle.com
Mon Feb 25 22:34:04 UTC 2019


Dan, Thank you for your review.

On 2/25/19 4:13 PM, Daniel D. Daugherty wrote:
> On 2/22/19 6:36 PM, coleen.phillimore at oracle.com wrote:
>> 8210457: JVM crash in ResolvedMethodTable::add_method(Handle)
>> Summary: Add a function to call NSME in ResolvedMethodTable to 
>> replace deleted methods.
>>
>> This Unsafe.throwX trick is also used for vtable initialization for 
>> throwing IllegalAccessError.  Tested with redefinition tests in the 
>> repository and tier1-3, and added tests.
>>
>> open webrev at 
>> http://cr.openjdk.java.net/~coleenp/2019/8181171.01/webrev
>
> src/hotspot/share/classfile/javaClasses.cpp
>     No comments.
>
> src/hotspot/share/memory/universe.hpp
>     No comments.
>
> src/hotspot/share/memory/universe.cpp
>     No comments.
>
> src/hotspot/share/oops/method.cpp
>     No comments.
>
> src/hotspot/share/prims/jvmtiRedefineClasses.cpp
>     L3533:       // There is a jmethodID, change it to point to the NSME.
>         Please consider:
>                  // Change the jmethodID to point to NSME.
>

Ok, change it.

> src/hotspot/share/prims/resolvedMethodTable.hpp
>     No comments.
>
> src/hotspot/share/prims/resolvedMethodTable.cpp
>     L134:     // Method may have been deleted, replace with NSME
>     L135:     if (method == NULL) {
>     L136:       method = Universe::throw_no_such_method_error();
>         Please consider:
>               if (method == NULL) {
>                 // Replace deleted method with NSME.
>                 method = Universe::throw_no_such_method_error();
>
In addition to the comment on L134?
> src/java.base/share/classes/jdk/internal/misc/Unsafe.java
>     No comments beyond Serguei's.
>
> test/jdk/java/lang/instrument/NamedBuffer.java
>     L91:     static boolean checkMatch(byte[] buf, byte[] name, int 
> begIdx) {
>     L92:         for (int i = 0; i < name.length; i++) {
>     L93:             if (buf[i + begIdx] != name[i]) {
>         This code assumes the buf.length >= name.length + begIdx
>         which could lead to array index problem. Perhaps add this
>         before L92:
>
>                  if (buf.length < name.length + begIdx) {
>                      return false;
>                  }
Oh yeah, this is bad.  Your solution looks good, so I added it. Thank you!

>
>     L101:     bytesForHostClass(char replace, String className) throws 
> Throwable {
>         A short header comment about what this function is doing would
>         be a good idea. Update: David asked for something similar.
>

Yes, I added a header comment for what this does.

     // This function reads a class file from disk and replaces the 
first character of
     // the name with the one passed as "replace".  Then goes through 
the bytecodes to
     // replace all instances of the name of the class with the new 
name.  The
     // redefinition tests use this to redefine Host$ classes with 
precompiled class files
     // Xost.java, Yost.java and Zost.java.

> L121:             if(checkMatch(buf, ptrnBytes, i)) {
>         nit - please add space after 'if' and before '('

Fixed.
>
> test/hotspot/jtreg/runtime/RedefineTests/RedefineDeleteJmethod.java
>     No comments.
>
> test/hotspot/jtreg/runtime/RedefineTests/libRedefineDeleteJmethod.c
>     L46:     // printf("visible 0x%x expected %d\n", visible, expected);
>         This commented out line appears unrelated to this test.

Removed it.
>
> test/jdk/java/lang/instrument/RedefineAddDeleteMethod/DeleteMethodHandle/MethodHandleDeletedMethod.java 
>
>     L34:  * @compile redef/Xost.java redef/Yost.java
>         File 
> test/jdk/java/lang/instrument/RedefineAddDeleteMethod/DeleteMethodHandle/redef/Yost.java
>         appears to be missing from the webrev. However, there appears 
> to be
>         no reference to Yost other than this compile line.
>
Thank you for catching that.  Yost is out of this test case but it's 
still in my repository, so it would have bombed when I checked it in :(
>
>     L87:             System.out.println("Passed, expected NSME");
>     L93:             System.out.println("Passed, expected NSME");
>         Perhaps both of these should be:
>                      System.out.println("Received expected NSME");
>
>         and the indication of "Passed" should be just before main()
>         returns.
>

Ok.  I changed it. I like a lot of positive reinforcement ...

> test/jdk/java/lang/instrument/RedefineAddDeleteMethod/DeleteMethodHandle/redef/Xost.java 
>
>     L28:     // try to redefine Xhost.
>         Should 'Xhost' be 'Xost'? Or??? Update: Serguei also mentioned 
> this one.
>

I missed this from Serguei's comments.  I fixed it now.

Thanks for the code review.  I made the above changes and I'll sanity 
check it before checking it in.
Coleen

> Dan
>
>
>> bug link https://bugs.openjdk.java.net/browse/JDK-8181171
>>
>> Thanks,
>> Coleen
>>
>



More information about the serviceability-dev mailing list