On Wed, 17 Jul 2024 19:47:44 GMT, Chen Liang <li...@openjdk.org> wrote:

> `Class` has 2 VM-injected fields that can be made explicit: `Object[] 
> signers` and `ProtectionDomain protectionDomain`. We make the signers field 
> explicit. (The ProtectionDomain can be revisited when SecurityManager is 
> removed, as SecurityManager is accessing it via JNI as well.)
> 
> Migrate the JNI code to Java. The getter previously had a redundant primitive 
> type check, which is dropped in the migrated Java code. The `Object[] 
> getSigners` is no longer `native`, thus requiring a CSR record. Reviewers 
> please help review the associated CSR.

Signers dates back to JDK 1.1, touching it now will shine light on long 
standing technical debt and other issues.

I think the main thing that is jumping out is that ClassLoader.setSigners 
(protected final method so may be called in subclasses) isn't fully specified 
and it is also missing a number of important checks. The method doesn't specify 
that the method ignores array classes or class objects for primitives. It 
doesn't say anything about the elements that aren't a Certificate are ignored. 
It doesn't specify null behavior either and doesn't say anything that the 
signers can change at any time. What's worse is that in the hands of a cowboy 
builder, it can be used to set or clear the signers for any Class, or keep a 
reference to the signers array and muck with them mid-flight. So lots of issues 
there.

Technical debt aside, I think the transformation looks okay, just a bit 
confusing to have signers declared under a comment "Set by VM", it's not clear 
the comment applies only to the classData before it. At some point I think we 
should put a question mark on the JVMTI JVMTI_HEAP_REFERENCE_SIGNERS heap ref 
and the HPROF heap dump CLASS record where there is a slot for the signers 
array. I don't see any need for these in 2024 and could be potentially be 
null'ed in the future (would require a JVM TI spec change of course).

On David's comment about exposing the field to code using 
Class.getDecalredField or Class.getDeclaredFields. Nosy code can use these 
methods to get a reference to the Field but it's not accessible by default. For 
now, code can using sun.misc.Unsafe but that is temporary and will go away. I 
don't have a strong opinion and no objection to adding it to the filter (which 
I think is what David is wondering about).

-------------

PR Comment: https://git.openjdk.org/jdk/pull/20223#issuecomment-2236065493

Reply via email to