[8u] RFR JDK-8161144: Fix for JDK-8147451 failed: Crash in Method::checked_resolve_jmethod_id(_jmethodID*)

Coleen Phillimore coleen.phillimore at oracle.com
Mon Aug 1 12:31:14 UTC 2016



On 8/1/16 7:19 AM, David Holmes wrote:
> Hi Shafi,
>
> On 1/08/2016 6:47 PM, Shafi Ahmad wrote:
>> Hi David,
>>
>> Sorry for my half mail.
>>
>>> -----Original Message-----
>>> From: David Holmes
>>> Sent: Monday, August 01, 2016 5:32 AM
>>> To: Shafi Ahmad; Coleen Phillimore; 
>>> hotspot-runtime-dev at openjdk.java.net
>>> Subject: Re: [8u] RFR JDK-8161144: Fix for JDK-8147451 failed: Crash in
>>> Method::checked_resolve_jmethod_id(_jmethodID*)
>>>
>>> Hi Shafi,
>>>
>>> On 30/07/2016 1:10 AM, Shafi Ahmad wrote:
>>>> Hi All,
>>>>
>>>> Could I have 2nd Reviewer's review for this change, please?
>>>
>>> I didn't see you respond to Coleen's query re JDK9. If this is not 
>>> applicable to
>>> JDK9 please add a 9-na label to the bug report.
>>>
>>> Looking at the code:
>>>
>>> +   void clear_method(Method* m) {
>>> +     for (JNIMethodBlock* b = this; b != NULL; b = b->_next) {
>>> +       for (int i = 0; i< number_of_methods; i++) {
>>> +         if (b->_methods[i] == m) {
>>> +           b->_methods[i] = NULL;
>>> +         }
>>> +       }
>>> +     }
>>> +     // not found
>>> +   }
>>>
>>> Based on the "not found" comment I assume you intended to do a return
>>> after NULLing out the method?
>>>
>>> Nit: need space after i in i<
>>>
>>> ---
>>>
>>> 1882 void Method::clear_jmethod_id(ClassLoaderData* loader_data) {
>>> 1883   loader_data->jmethod_ids()->clear_method(this);
>>> 1884 }
>>>
>>> Not sure why you felt the need to add a new member function for this
>>> instead of just doing line #1883 directly at line #113
>>
>> Just to make it consistent with the existing method like void 
>> Method::clear_jmethod_ids(ClassLoaderData* loader_data).
>
> I would not add to the API unnecessarily as it just makes the API 
> harder to understand.

I think this API is good rather than telling Method::deallocate_contents 
that there's a jmethod_ids pointer in the class_loader data.   If this 
changes for some reason, it would be good to change it together with the 
other APIs.

Shafi, can you move this function down to below Method::set_on_stack?  
Then it'll be clearer that it belongs with Method::clear_jmethod_ids().

Thanks,
Coleen
>
>>> ---
>>>
>>>  >>> After this change I am seeing Method::is_method_id() is 
>>> getting  >>>
>>> called with NULL and I have done below change to avoid crash >>>  >>> -
>>> assert(m != NULL, "should be called with non-null method"); >>> +  
>>> if (m ==
>>> NULL) {
>>>  >>> +    return false;
>>>  >>> +  }
>>>
>>> This is the only call I can see to is_method_id:
>>
>> Yes, this is the only call.
>>
>>>
>>> 1870 Method* Method::checked_resolve_jmethod_id(jmethodID mid) {
>>> 1871   if (mid == NULL) return NULL;
>>> 1872   if (!Method::is_method_id(mid)) {
>>> 1873     return NULL;
>>> 1874   }
>>>
>>
>>
>>
>>> So I don't see how it can be being passed NULL. If it is then you 
>>> have a
>>> problem!
>>
>> Here actual parameter 'mid"  of  method is_method_id is not null but 
>> this  we are calling another method resolve_jmethod_id(mid) which 
>> returns NULL i.e m becomes null in below code.
>>
>> 1885 bool Method::is_method_id(jmethodID mid) {
>> 1886   Method* m = resolve_jmethod_id(mid);
>> 1887   if (m == NULL) {
>> 1888     return false;
>> 1889   }
>
> Ah I see - sorry. Thanks for clarifying.
>
> David
>
>>
>> Regards,
>> Shafi
>>
>>>
>>> Thanks,
>>> David
>>> -----
>>>
>>>
>>>> Regards,
>>>> Shafi
>>>>
>>>>> -----Original Message-----
>>>>> From: Coleen Phillimore
>>>>> Sent: Monday, July 25, 2016 5:52 PM
>>>>> To: hotspot-runtime-dev at openjdk.java.net
>>>>> Subject: Re: [8u] RFR JDK-8161144: Fix for JDK-8147451 failed: Crash
>>>>> in
>>>>> Method::checked_resolve_jmethod_id(_jmethodID*)
>>>>>
>>>>>
>>>>> This looks good.  Was this a backport or is it still broken in 9?
>>>>> thanks,
>>>>> Coleen
>>>>>
>>>>> On 7/25/16 7:53 AM, Shafi Ahmad wrote:
>>>>>> Hi,
>>>>>>
>>>>>> Please review the small code change for bug: "JDK-8161144: Fix for
>>>>>> JDK-
>>>>> 8147451 failed: Crash in
>>>>> Method::checked_resolve_jmethod_id(_jmethodID*)" on jdk8u-dev
>>>>>>
>>>>>> Summary:
>>>>>> Method::deallocate_contents() should clear 'this' from list of
>>>>>> Methods in
>>>>> JNIMethodBlock, similarly to clear_all_methods() does it, when class
>>>>> is unloaded.
>>>>>> After this change I am seeing Method::is_method_id() is getting
>>>>>> called with
>>>>> NULL and I have done below change to avoid crash
>>>>>>
>>>>>> -  assert(m != NULL, "should be called with non-null method");
>>>>>> +  if (m == NULL) {
>>>>>> +    return false;
>>>>>> +  }
>>>>>>
>>>>>> Webrev: http://cr.openjdk.java.net/~shshahma/8161144/webrev/
>>>>>> Jdk8 bug: https://bugs.openjdk.java.net/browse/JDK-8161144
>>>>>>
>>>>>> Test:  Run jprt
>>>>>>
>>>>>> Regards,
>>>>>> Shafi
>>>>>



More information about the hotspot-runtime-dev mailing list