RFR(XS): JDK-8229375 Memory corruption in the implementation of the stack walk API

Ioi Lam ioi.lam at oracle.com
Fri Aug 9 19:48:03 UTC 2019



On 8/9/19 11:24 AM, Frederic Parain wrote:
> Changing the prototype to set_bci(oop, short) would be nice, but
> there’s a lot of code in the JVM still using an int to store the bci.
> Just to list a few:
>
>    - java_lang_StackFrameInfo::set_method_and_bci()
>    - class BaseFrameStream and its sub-classes JavaFrameStream and LiveFrameStream
>    - class javaVFrame and its sub-classes interpretedVFrame and compiledVFrame
>    - class jvmtiDeferredLocalVariableSet
>    - class BaseBytecodeStream
>    - struct BacktraceElement
>    - class BasicBlock
>    - class CallJavaNode
>    - class ciReturnAddress
>
> And at least the first three of this shortened list are used by the stack walk API.
I think bci is not really a short. It should be a ushort, since the max 
value is 0xffff. Anyway, I agree that it's best to keep the existing 
function signature, or else we will be adding a lot of type casts 
everywhere.

> I’d prefer the assert solution based on the JVMS definition of method’s length:
>
> code_length
> The value of the code_length item gives the number of bytes in the code array for this method.
> The value of code_length must be greater than zero (as the code array must not be empty) and less than 65536.
>
> Which would produce something like this:
>
> void java_lang_StackFrameInfo::set_bci(oop element, short value) {
>    assert(value >= 0 && value < 65536, “bci outside of valid range”);
>    element->short_field_put(_bci_offset, value);
> }
Did you mean to declare <value> as an int in the code above?

It might be even better to get the method from <element>, and assert

     value >= 0 && value < method->code_size()


Thanks
- Ioi

>
> What do yo think?
>
> Fred
>
>
>> On Aug 9, 2019, at 13:08, Aleksey Shipilev <shade at redhat.com> wrote:
>>
>> On 8/9/19 6:54 PM, Frederic Parain wrote:
>>> CR: https://bugs.openjdk.java.net/browse/JDK-8229375
>>> Webrev: http://cr.openjdk.java.net/~fparain/8229375/webrev.00/index.html
>> Oh wow. It apparently foobars the injected "version" field, see the comment in the issue.
>>
>> The fix looks okay. Should we least assert the range of the int value we are storing there? Or even
>> make set_bci(oop, *short*)?
>>
>> -- 
>> Thanks,
>> -Aleksey
>>



More information about the hotspot-runtime-dev mailing list