On Wed, 30 Sep 2020 04:59:20 GMT, Yumin Qi <mi...@openjdk.org> wrote:

>> This patch is reorganized after 8252725, which is separated from this patch 
>> to refactor jlink glugin code. The previous
>> webrev with hg can be found at: 
>> http://cr.openjdk.java.net/~minqi/2020/8247536/webrev-05. With 8252725 
>> integrated, the
>> regeneration of holder classes is simply to call the new added 
>> GenerateJLIClassesHelper.cdsGenerateHolderClasses
>> function.  Tests: tier1-4
>
> Yumin Qi has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Remove trailing word of line which is not used in holder class 
> regeneration. There is a trailing LF (Line Feed) so trim
>   white spaces from both front and end of the line or it will fail method 
> type validation.

Changes requested by iklam (Reviewer).

test/hotspot/jtreg/runtime/cds/appcds/DumpClassListWithLF.java line 70:

> 68:                 "Hello",
> 69:                 "@lambda-form-invoker [LF_RESOLVE] 
> java.lang.invoke.DirectMethodHandle$Holder invokeNothing  L7_L
> (anyword)", 70:                 "@lambda-form-invoker [LF_RESOLVE] 
> java.lang.invoke.DirectMethodHandle$Holder
> invokeNothing  LL_I anyword"),

We shouldn't allow the classlist to contain arbitrary data. These two cases 
should generate an error.

src/hotspot/share/classfile/lambdaFormInvokers.cpp line 52:

> 50:
> 51: // trim white spaces from front and end of string.
> 52: char* trim(char* s) {

I think this creates unnecessary dependency between the C code and the Java 
code. The C code assumes that the Java code
has appended something like "(salvaged)" into the output, and tries to get rid 
of that in a non-obvious way. It's
better to modify the Java code from

static void traceSpeciesType(String cn, Class<?> salvage) {
    if (TRACE_RESOLVE || CDS.isDumpLoadedClassList()) {
        String traceSP = SPECIES_RESOLVE + " " + cn + (salvage != null ? " 
(salvaged)" : " (generated)");
        if (TRACE_RESOLVE) {
            System.out.println(traceSP);
        }
        CDS.logTraceResolve(traceSP);
    }
}

to

    if (TRACE_RESOLVE || CDS.isDumpLoadedClassList()) {
        String traceSP = SPECIES_RESOLVE + " " + cn;
        if (TRACE_RESOLVE) {
            System.out.println(traceSP + (salvage != null ? " (salvaged)" : " 
(generated)"));
        }
        CDS.logTraceResolve(traceSP);
    }

test/hotspot/jtreg/runtime/cds/appcds/DumpClassListWithLF.java line 85:

> 83:             appJar, classlist(
> 84:                 "Hello",
> 85:                 "@lambda-form-invoker [LF_XYRESOLVE] 
> java.lang.invoke.DirectMethodHandle$Holder invokeStatic  L7_L
> (any)",

We should not allow incorrect input. This should generate an error.

test/hotspot/jtreg/runtime/cds/appcds/DumpClassListWithLF.java line 78:

> 76:                 "Hello",
> 77:                 "@lambda-form-invoker [LF_RESOLVE] 
> my.nonexist.package.MyNonExistClassName$holder invokeStatic
> L7_L", 78:                 "@lambda-form-invoker [LF_RESOLVE] 
> my.nonexist.package.MyNonExistClassName$holder
> invokeStatic  LL_I"),

I think it's dangerous to allow arbitrary class names here. 
InvokerBytecodeGenerator doesn't check the classname. This
will make it possible to overwrite the contents of arbitrary classes. We should 
have a check here and allow only the
specific holder classes that are supported.

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

PR: https://git.openjdk.java.net/jdk/pull/193

Reply via email to