Why having the wrong InnerClasses attribute is an issue for the VM ?
forax at univ-mlv.fr
forax at univ-mlv.fr
Mon Nov 30 12:53:00 UTC 2020
----- Mail original -----
> De: "David Holmes" <david.holmes at oracle.com>
> À: "Remi Forax" <forax at univ-mlv.fr>
> Cc: "core-libs-dev" <core-libs-dev at openjdk.java.net>
> Envoyé: Lundi 30 Novembre 2020 13:44:32
> Objet: Re: Why having the wrong InnerClasses attribute is an issue for the VM ?
> On 30/11/2020 8:04 pm, forax at univ-mlv.fr wrote:
>> ----- Mail original -----
>>> De: "David Holmes" <david.holmes at oracle.com>
>>> À: "Remi Forax" <forax at univ-mlv.fr>, "core-libs-dev"
>>> <core-libs-dev at openjdk.java.net>
>>> Envoyé: Lundi 30 Novembre 2020 08:57:37
>>> Objet: Re: Why having the wrong InnerClasses attribute is an issue for the VM ?
>>
>>> On 30/11/2020 5:08 pm, Remi Forax wrote:
>>>> I've forgotten a cast in an invokedynamic, hence a call to wrongTargetType,
>>>> but in order to create the error message, MethodType.toString(), getSimpleName()
>>>> is called and it fails because getDeclaringClass() verifies the InnerClasses
>>>> attribute.
>>>>
>>>> For me InnerClasses was just an attribute for javac not something the VM should
>>>> take care of,
>>>> it seems that the VM strongly verifies this attribute and i wonder what is the
>>>> reason behind that ?
>>>
>>> From the VM code - InstanceKlass::compute_enclosing_class:
>>>
>>> // Throws an exception if outer klass has not declared k as an inner
>>> klass
>>> // We need evidence that each klass knows about the other, or else
>>> // the system could allow a spoof of an inner class to gain access
>>> rights.
>>> Reflection::check_for_inner_class(outer_klass, this,
>>> *inner_is_member, CHECK_NULL);
>>
>> I don't understand how to spoof the InnerClasses attribute to gain access given
>> that the access rights are not based on the InnerClasses attribute.
>
> Good point.
>
> That aside though, how do you answer the is_top_level_class question if
> the enclosed and enclosing classes disagree about the relationship?
Good question too,
only by looking to the information stored in the class that can be top_level or not, i suppose.
>
> David
> -----
>
Rémi
>>>
>>> David
>>
>> Rémi
>>
>>>
>>>> regards,
>>>> Rémi
>>>>
>>>> Exception in thread "main" java.lang.IncompatibleClassChangeError:
>>>> fr.umlv.transmogrif.ImplMap and
>>>> fr.umlv.transmogrif.ImplMap$Row/0x0000000801007400 disagree on InnerClasses
>>>> attribute
>>>> at java.base/java.lang.Class.getDeclaringClass0(Native Method)
>>>> at java.base/java.lang.Class.isTopLevelClass(Class.java:1970)
>>>> at java.base/java.lang.Class.getSimpleBinaryName(Class.java:1955)
>>>> at java.base/java.lang.Class.getSimpleName0(Class.java:1835)
>>>> at java.base/java.lang.Class.getSimpleName(Class.java:1826)
>>>> at java.base/java.lang.Class.getSimpleName0(Class.java:1833)
>>>> at java.base/java.lang.Class.getSimpleName(Class.java:1826)
>>>> at java.base/java.lang.invoke.MethodType.toString(MethodType.java:895)
>>>> at java.base/java.lang.String.valueOf(String.java:3365)
>>>> at java.base/java.lang.StringBuilder.append(StringBuilder.java:169)
>>>> at
>>>> java.base/java.lang.invoke.MethodHandle.standardString(MethodHandle.java:1611)
>>>> at java.base/java.lang.invoke.MethodHandle.toString(MethodHandle.java:1608)
>>>> at java.base/java.lang.String.valueOf(String.java:3365)
>>>> at java.base/java.lang.invoke.CallSite.wrongTargetType(CallSite.java:203)
>>>> at java.base/java.lang.invoke.CallSite.makeSite(CallSite.java:333)
>>>> at
>>>> java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:280)
>>>> at
>>>> java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:270)
>>>> at fr.umlv.transmogrif.ImplMap/0x0000000801003c00.<init>(ImplMap.java:21)
> >>> at fr.umlv.transmogrif.Main.main(Main.java:7)
More information about the core-libs-dev
mailing list