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

Daniel D. Daugherty daniel.daugherty at oracle.com
Mon Feb 25 21:13:11 UTC 2019


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.

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();

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;
                  }

     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.

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

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.

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.


     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.

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.

Dan


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



More information about the serviceability-dev mailing list