On Fri, 12 Feb 2021 02:10:02 GMT, Coleen Phillimore <[email protected]> wrote:
>> Claes Redestad has updated the pull request incrementally with one
>> additional commit since the last revision:
>>
>> Consolidate verifyClassname and verifyFixClassname
>
> This more limited cleanup looks good.
This patch changes `JVM_FindLoadedClass` interface to only accept a binary
name. It used to accept both a binary name and internal form. Most, if not
all, JVM entry points take the name of internal name. So this change makes
this JVM entry point inconsistent with others.
Looking closer each API that involves `fixClassName` or `verifyXXXClassName`,
the JVM entry points called expects the internal form except
`JVM_FindLoadedClass` (see details below). I think a better change is to
change the native `JVM_FindLoadedClass` to accept the internal form only and
have `findLoadedClass0` method to detect if the name contains '/' or '['.
ClassLoader API does not allow loading of an array type whereas
`Class::forName` allows to find an array type. Perhaps `verifyFixClassName`
should be renamed like `binaryNameToInternalForm`. I think we don't need
`fixClassname`?
ClassLoader::defineClass
- `preDefineClass` checks the name and throws if it contains '/' or '['
- no name check in `JVM_DefineClassWithSource` and `JVM_LookupDefineClass`
which expects the name is of internal form
native Class::forName0
- converts the binary name to internal form (i.e. replace '.' with '/')
- throw if the name contains '/'
- no explicit name check in `JVM_FindClassFromCaller`
ClassLoader::loadClass
- calls native `findLoadedClass0` that calls `JVM_FindLoadedClass` which
accepts binary form and converts '.' to '/' but the current implementation
accepts both binary name and internal form
- calls `native findBootstrapClass` which converts '.' to '/' and pass the
internal
form to `JVM_FindBootstrapClass`.
It'd be helpful to document the internal APIs and JVM entry points clearly what
it expects for example binary name vs internal form and where it does the
validation e.g. Class::forName0 allows array type and native library methods do
the name validation.
-------------
PR: https://git.openjdk.java.net/jdk/pull/2378