RFR 8166358: Re-enable String verification in java_lang_String::create_from_str()

David Holmes david.holmes at oracle.com
Mon May 25 02:41:29 UTC 2020


Hi Coleen,

On 22/05/2020 10:12 pm, coleen.phillimore at oracle.com wrote:
> 
> 
> On 5/22/20 7:34 AM, coleen.phillimore at oracle.com wrote:
>>
>> David, thanks for looking at this.
>>
>> On 5/22/20 3:26 AM, David Holmes wrote:
>>> Hi Coleen,
>>>
>>> Overall this looks good. A few minor comments below.
>>>
>>> On 22/05/2020 6:34 am, coleen.phillimore at oracle.com wrote:
>>>> Summary: Check for invalid strings in class names in debug mode, and 
>>>> only verify valid strings in create_for_str().
>>>>
>>>> See bug for more information on why this commented out code needs to 
>>>> be conditional but not commented out.  Tested with mach5 tier1-6, 
>>>> and new test for new -Xcheck:jni check.
>>>>
>>>> open webrev at 
>>>> http://cr.openjdk.java.net/~coleenp/2020/8166358.01/webrev
>>>> bug link https://bugs.openjdk.java.net/browse/JDK-8166358
>>>
>>> src/hotspot/share/classfile/javaClasses.cpp
>>>
>>> I'm a bit confused about adding the validity check at the end of 
>>> java_lang_String::create_from_str. Don't we need to ensure it is 
>>> valid before doing those other Utf8 operations on it?
>>
>> If I return NULL when the string isn't a valid UTF8 string, Cassandra 
>> gets a NPE.  I do think it should be fixed, I just don't know how to 
>> fix it.
> 
> Oh, I don't think I answered this.  The conversion functions seem to do 
> their best and insert utf8 control characters in (see the bug comments 
> for an example).  Changing what we do for this case might break a lot of 
> programs, so I didn't change it.

Okay. Still seems a little odd. :)

> 
>>>
>>>     // This check is too strict because the input string is not 
>>> necessarily valid UTF8.
>>>     // For example, it may be created with arbitrary content via 
>>> jni_NewStringUTF.
>>> !   if (UTF8::is_legal_utf8((const unsigned char*)utf8_str, 
>>> (int)strlen(utf8_str), false)) {
>>>
>>> The comment needs adjusting now that you are guarding the check with 
>>> is_legal_utf8().
>>
>> I read that comment as explaining why we guard the check.  Maybe 
>> s/because/when/ above? and remove "not necessarily"?

// This check is too strict when the input string is not valid UTF8.

Works for me.

>>>
>>> ---
>>>
>>> src/hotspot/share/classfile/systemDictionary.cpp
>>>
>>> +      return NULL;
>>>
>>> Indentation appears off by one.
>> fixed.
>>>
>>> ---
>>>
>>> src/hotspot/share/prims/jvm.cpp
>>>
>>> I think this comment block:
>>>
>>> // Since exceptions can be thrown, class initialization can take place
>>> // if name is NULL no check for class name in .class stream has to be 
>>> made.
>>>
>>> should be read as:
>>>
>>> // Since exceptions can be thrown, class initialization can take place.
>>> // If name is NULL no check for class name in .class stream has to be 
>>> made.
>>>
>>> so your changes to the comment:
>>>
>>> // Since exceptions can be thrown, class initialization can take place
>>> // if name is NULL. The class name is checked in the .class stream.
>>
>> I didn't understand the preexisting comment block at all then.  If the 
>> name passed in is NULL, then we must check the class name in the 
>> bytecode stream.  How can we not?
>>
>> By "check" I assume that means "check that it's a valid class name".
>>
>> Might the comment mean that that if the class_name passed in is NULL 
>> we don't check it against the one in the .class stream that it's the 
>> same?  How is that at all interesting here in this context?  What is 
>> this comment trying to say here?  I assume that it's okay for the 
>> class name to be null in these contexts because we get the class name 
>> from the .class stream.

I'm a bit unclear here as well. I think the comment is saying that when 
the class_name passed in is NULL that we don't have to check that it 
matches the one in the class stream. But I also don't see the relevance 
of such a comment in this context. Perhaps just delete:

  320   // Since exceptions can be thrown, class initialization can take 
place
  321   // if name is NULL no check for class name in .class stream has 
to be made.

Thanks,
David
-----

>>
>> Coleen
>>
>>>
>>> don't appear appropriate.
>>>
>>> Thanks,
>>> David
>>> -----
>>>
>>>> Thanks,
>>>> Coleen
>>
> 


More information about the hotspot-runtime-dev mailing list