RFR (S) 8181171: Deleting method for RedefineClasses breaks ResolvedMethodName
Daniel D. Daugherty
daniel.daugherty at oracle.com
Mon Feb 25 22:39:42 UTC 2019
> 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?
No. Drop the comment on L134.
Dan
On 2/25/19 5:34 PM, coleen.phillimore at oracle.com wrote:
>
> 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