Could I have 2nd reviewer?

Leonid

> On Jun 25, 2020, at 10:58 AM, Leonid Mesnik <leonid.mes...@oracle.com> wrote:
> 
> Ping
> 
>> On Jun 12, 2020, at 4:18 PM, Leonid Mesnik <leonid.mes...@oracle.com 
>> <mailto:leonid.mes...@oracle.com>> wrote:
>> 
>> Fixed all places, updated copyright. Still need second review
>> 
>> http://cr.openjdk.java.net/~lmesnik/8242891/webrev.02/ 
>> <http://cr.openjdk.java.net/~lmesnik/8242891/webrev.02/>
>> Leonid
>> 
>> On 6/11/20 8:41 PM, serguei.spit...@oracle.com 
>> <mailto:serguei.spit...@oracle.com> wrote:
>>> Hi Leonid,
>>> 
>>> It is much better now.
>>> 
>>> Several places still need the same fix.
>>> 
>>> http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetAllThreads/allthr001/allthr001.cpp.frames.html
>>>  
>>> <http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetAllThreads/allthr001/allthr001.cpp.frames.html>
>>> 
>>>  211     for (i = 0; i < thrInfo[ind].cnt; i++) {
>>>  212         for (j = 0, found = 0; j < threadsCount && !found; j++) {
>>>  213             err = jvmti->GetThreadInfo(threads[j], &inf);
>>>  214             if (err != JVMTI_ERROR_NONE) {
>>>  215                 printf("Failed to get thread info: %s (%d)\n",
>>>  216                        TranslateError(err), err);
>>>  217                 result = STATUS_FAILED;
>>>  218             }
>>>  219             if (printdump == JNI_TRUE) {
>>>  220                 printf(" >>> %s", inf.name);
>>>  221             }
>>>  222             found = (inf.name != NULL &&
>>>  223                      strstr(inf.name, thrInfo[ind].thrNames[i]) == 
>>> inf.name &&
>>>  224                      (ind == 4 || strlen(inf.name) ==
>>>  225                       strlen(thrInfo[ind].thrNames[i])));
>>>  226         }
>>> A return is needed after line 217, otherwise the the inf value is used at 
>>> lines 222-224.
>>> 
>>> http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetBytecodes/bytecodes003/bytecodes003.cpp.frames.html
>>>  
>>> <http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetBytecodes/bytecodes003/bytecodes003.cpp.frames.html>
>>> 
>>> A return is needed for the errors:
>>>  363                 result = STATUS_FAILED;
>>>  372                 result = STATUS_FAILED;
>>>  384                     result = STATUS_FAILED;
>>> 
>>> http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/MethodEntry/mentry001/mentry001.cpp.frames.html
>>>  
>>> <http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/MethodEntry/mentry001/mentry001.cpp.frames.html>
>>> 
>>> A return is needed for the errors:
>>>   82         result = STATUS_FAILED;
>>>   94             result = STATUS_FAILED;
>>>  100             result = STATUS_FAILED;
>>> 
>>> http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/MethodExit/mexit001/mexit001.cpp.frames.html
>>>  
>>> <http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/MethodExit/mexit001/mexit001.cpp.frames.html>
>>> 
>>> A return is needed for the error:
>>>   98             result = STATUS_FAILED;
>>> 
>>> http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/MethodExit/mexit002/mexit002.cpp.frames.html
>>>  
>>> <http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/MethodExit/mexit002/mexit002.cpp.frames.html>
>>> 
>>> A return is needed for the error:
>>>   98             result = STATUS_FAILED;
>>> 
>>> http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass019/redefclass019.cpp.frames.html
>>>  
>>> <http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass019/redefclass019.cpp.frames.html>
>>> 
>>> A return is needed for the error:
>>>  186             result = STATUS_FAILED;
>>> 
>>> Also, I do not like many uninitialized locals in these tests.
>>> But it is for another pass.
>>> 
>>> Otherwise, it looks good.
>>> No need for another webrev if you fix the above.
>>> I hope, you will update copyright comments before push.
>>> 
>>> Thanks,
>>> Serguei
>>> 
>>> 
>>> On 6/11/20 15:30, Leonid Mesnik wrote:
>>>> Agree, it would be better to don't try to use data from functions with 
>>>> error code. The new webrev:
>>>> 
>>>> http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/ 
>>>> <http://cr.openjdk.java.net/~lmesnik/8242891/webrev.01/>
>>>> I tried to prevent any usage of possibly corrupted data. Mostly strings or 
>>>> allocated data, sometimes method/class id which are used my other JVMTI 
>>>> functions.
>>>> 
>>>> Leonid
>>>> 
>>>> On 6/9/20 6:59 PM, serguei.spit...@oracle.com 
>>>> <mailto:serguei.spit...@oracle.com> wrote:
>>>>> On 6/9/20 12:58, Leonid Mesnik wrote:
>>>>>> Hi
>>>>>> 
>>>>>> 
>>>>>> On 6/9/20 12:34 PM, serguei.spit...@oracle.com 
>>>>>> <mailto:serguei.spit...@oracle.com> wrote:
>>>>>>> Hi Leonid,
>>>>>>> 
>>>>>>> Thank you for taking care about this!
>>>>>>> It looks good in general.
>>>>>>> However, I think, a similar return is needed in more cases.
>>>>>>> 
>>>>>>> One example:
>>>>>>> 
>>>>>>> http://cr.openjdk.java.net/~lmesnik/8242891/webrev.00/test/hotspot/jtreg/vmTestbase/nsk/jvmti/Exception/exception001/exception001.cpp.frames.html
>>>>>>>  
>>>>>>> <http://cr.openjdk.java.net/~lmesnik/8242891/webrev.00/test/hotspot/jtreg/vmTestbase/nsk/jvmti/Exception/exception001/exception001.cpp.frames.html>
>>>>>>> 
>>>>>>>  99     err = jvmti_env->GetMethodDeclaringClass(method, &cls);
>>>>>>>  100     if (err != JVMTI_ERROR_NONE) {
>>>>>>>  101         printf("(GetMethodDeclaringClass#t) unexpected error: %s 
>>>>>>> (%d)\n",
>>>>>>>  102                TranslateError(err), err);
>>>>>>>  103         result = STATUS_FAILED;
>>>>>>>  <> 104         return;
>>>>>>>  105     }
>>>>>>>  106     err = jvmti_env->GetClassSignature(cls, &ex.t_cls, &generic);
>>>>>>>  107     if (err != JVMTI_ERROR_NONE) {
>>>>>>>  108         printf("(GetClassSignature#t) unexpected error: %s (%d)\n",
>>>>>>>  109                TranslateError(err), err);
>>>>>>>  110         result = STATUS_FAILED;
>>>>>>>  111     }
>>>>>>>  112     err = jvmti_env->GetMethodName(method,
>>>>>>>  113         &ex.t_name, &ex.t_sig, &generic);
>>>>>>>  114     if (err != JVMTI_ERROR_NONE) {
>>>>>>>  115         printf("(GetMethodName#t) unexpected error: %s (%d)\n",
>>>>>>>  116                TranslateError(err), err);
>>>>>>>  117         result = STATUS_FAILED;
>>>>>>>  118     }
>>>>>>>  119     ex.t_loc = location;
>>>>>>>  120     err = jvmti_env->GetMethodDeclaringClass(catch_method, &cls);
>>>>>>>  121     if (err != JVMTI_ERROR_NONE) {
>>>>>>>  122         printf("(GetMethodDeclaringClass#c) unexpected error: %s 
>>>>>>> (%d)\n",
>>>>>>>  123                TranslateError(err), err);
>>>>>>>  124         result = STATUS_FAILED;
>>>>>>>  <> 125         return;
>>>>>>>  126     }
>>>>>>>  127     err = jvmti_env->GetClassSignature(cls, &ex.c_cls, &generic);
>>>>>>>  128     if (err != JVMTI_ERROR_NONE) {
>>>>>>>  129         printf("(GetClassSignature#c) unexpected error: %s (%d)\n",
>>>>>>>  130                TranslateError(err), err);
>>>>>>>  131         result = STATUS_FAILED;
>>>>>>>  132     }
>>>>>>>  133     err = jvmti_env->GetMethodName(catch_method,
>>>>>>>  134         &ex.c_name, &ex.c_sig, &generic);
>>>>>>>  135     if (err != JVMTI_ERROR_NONE) {
>>>>>>>  136         printf("(GetMethodName#c) unexpected error: %s (%d)\n",
>>>>>>>  137                TranslateError(err), err);
>>>>>>>  138         result = STATUS_FAILED;
>>>>>>>  139     }
>>>>>>> 
>>>>>>> In the fragment above you added return for JVMTI 
>>>>>>> GetMethodDeclaringClass error.
>>>>>>> But GetMethodName and GetClassSignature can be also problematic as the 
>>>>>>> returned names are printed below.
>>>>>>> It seems to be more safe and even simpler to add returns for such cases 
>>>>>>> as well.
>>>>>>> Otherwise, the code reader is puzzled why there is a return in one 
>>>>>>> failure case and there is no such return in another.
>>>>>> It is a good question if we want to fix such places or even fails with 
>>>>>> first JVMTI failure. (I even started to fix it in the such way but find 
>>>>>> that existing tests usually don't fail always).
>>>>>> 
>>>>> 
>>>>> I do not suggest to fix all the tests but those which you are already 
>>>>> fixing.
>>>>> 
>>>>> 
>>>>>> 
>>>>>> The difference is that test tries to reuse "cls" in other JVMTI function 
>>>>>> and going to generate very misleading crash. How it just tries to 
>>>>>> compare ex and exs values. So test might crash but clearly outside of 
>>>>>> JVMTI function and with some useful info. So I am not sure if fixing 
>>>>>> these lines improve test failure handling.
>>>>>> 
>>>>> 
>>>>> If JVMTI functions fail with an error code the results with symbolic 
>>>>> strings must be considered invalid.
>>>>> However, they are used later (the values are printed).
>>>>> It is better to bail out in such cases.
>>>>> It should not be a problem to add similar returns in such cases.
>>>>> Or do you think it is important to continue execution for some reason?
>>>>> 
>>>>>> Assuming that most of existing tests fails early only if going to re-use 
>>>>>> possible corrupted data I propose to fix this separately. We need to 
>>>>>> figure out when to fail or to try to finish.
>>>>>> 
>>>>> 
>>>>> Do you suggest it for the updated tests only or for all the tests with 
>>>>> such problems?
>>>>> 
>>>>> Thanks,
>>>>> Serguei
>>>>> 
>>>>>> 
>>>>>> Leonid
>>>>>> 
>>>>>>> 
>>>>>>> Thanks,
>>>>>>> Serguei
>>>>>>> 
>>>>>>> 
>>>>>>> On 6/1/20 21:33, Leonid Mesnik wrote:
>>>>>>>> Hi 
>>>>>>>> 
>>>>>>>> Could you please review following fix which stop test execution if 
>>>>>>>> JVMTI function returns error. The test fails anyway however using 
>>>>>>>> potentially bad data in JVMTI function might cause misleading crash 
>>>>>>>> failures. The hs_err will contains the stacktrace not with problem 
>>>>>>>> function but with function called with corrupted data. Most of tests 
>>>>>>>> already has such behavior but not all. Also I fixed a couple of tests 
>>>>>>>> to finish if they haven't managed to suspend thread. 
>>>>>>>> 
>>>>>>>> I've updated only tests which try to use corrupted data in JVMTI 
>>>>>>>> functions after errors. I haven't updated tests which just 
>>>>>>>> compare/print values from erroring JVMTI functions. The crash in 
>>>>>>>> strcmp/println is not so misleading and might be point to real issue. 
>>>>>>>> 
>>>>>>>> webrev: http://cr.openjdk.java.net/~lmesnik/8242891/webrev.00/ 
>>>>>>>> <http://cr.openjdk.java.net/~lmesnik/8242891/webrev.00/> 
>>>>>>>> 
>>>>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8242891 
>>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8242891> 
>>>>>>>> 
>>>>>>>> Leonid 
>>>>>>>> 
>>>>>>> 
>>>>> 
>>> 
> 

Reply via email to