RFR (M): 8161224: CONSTANT_NameAndType_info permits references to illegal names and descriptors

Rachel Protacio rachel.protacio at oracle.com
Tue Sep 6 20:34:16 UTC 2016


Great, thanks!

Rachel


On 9/6/2016 4:29 PM, Dmitry Dmitriev wrote:
> Looks good!
>
> Thanks,
> Dmitry
> ----- Original Message -----
> From: rachel.protacio at oracle.com
> To: dmitry.dmitriev at oracle.com
> Cc: hotspot-runtime-dev at openjdk.java.net
> Sent: Tuesday, September 6, 2016 11:23:11 PM GMT +03:00 Iraq
> Subject: Re: RFR (M): 8161224: CONSTANT_NameAndType_info permits 
> references to illegal names and descriptors
>
> That sounds fair to me. How's this?
>
>     @@ -4843,19 +4840,28 @@
>              }
>            }
>            else {
>     -        // 4900761: For class version > 48, any unicode is
>     allowed in class name.
>     +        // Skip leading 'L' and ignore first appearance of ';'
>              length--;
>              signature++;
>     -        while (length > 0 && signature[0] != ';') {
>     -          if (signature[0] == '.') {
>     -            classfile_parse_error("Class name contains illegal
>     character '.' in descriptor in class
>     file %s", CHECK_0);
>     -          }
>     -          length--;
>     -          signature++;
>     -        }
>     -        if (signature[0] == ';') { return signature + 1; }
>     -      }
>     -
>     +        char* c = strchr((char*) signature, ';');
>     +        // Format check signature
>     +        if (c != NULL) {
>     +          ResourceMark rm(THREAD);
>     +          int newlen = c - (char*) signature;
>     +          char* sig = NEW_RESOURCE_ARRAY(char, newlen + 1);
>     +          strncpy(sig, signature, newlen);
>     +          sig[newlen] = '\0';
>     +
>     +          bool legal = verify_unqualified_name(sig, newlen,
>     LegalClass);
>     +          if (!legal) {
>     +            classfile_parse_error("Class name contains illegal
>     character "
>     +                                  "in descriptor in class file %s",
>     +                                  CHECK_0);
>     +            return NULL;
>     +          }
>     +          return signature + newlen + 1;
>     +        }
>     +      }
>            return NULL;
>          }
>          case JVM_SIGNATURE_ARRAY:
>
> It builds fine and passes the jck tests in question.
> Rachel
>
> On 9/6/2016 4:14 PM, Dmitry Dmitriev wrote:
>
>     Hi Rachel,
>
>     Small question about resource mark: on line 4850 you allocate new resource array which is used only in verify_unqualified_name() call. Do we need resource mark in this block?
>
>     Thanks,
>     Dmitry
>
>     ----- Original Message -----
>     From:rachel.protacio at oracle.com
>     To:hotspot-runtime-dev at openjdk.java.net
>     Sent: Tuesday, September 6, 2016 11:01:45 PM GMT +03:00 Iraq
>     Subject: Re: RFR (M): 8161224: CONSTANT_NameAndType_info permits references to illegal names and descriptors
>
>     Hi Harold,
>
>     Thanks for the review! I've removed the resource mark. If no further
>     comments in the next hour, will commit.
>
>     Rachel
>
>     On 9/6/2016 3:29 PM, harold seigel wrote:
>
>         Hi Rachel,
>
>         The change looks good.  Just one nit:
>
>         No resource mark is needed before calling classfile_parse_error() at
>         line 4857.
>
>         (No new RFR needed.)
>
>         Thanks, Harold
>
>
>         On 9/1/2016 5:30 PM, Rachel Protacio wrote:
>
>             Hello!
>
>             Please review this fix, which addresses a few issues related to
>             incomplete format checking with NameAndType names and signatures.
>
>             First, the code that should have been format checking the strings in
>             later classfile versions was in fact just checking for periods, so
>             I've rewritten it to call verify_unqualified_name(). Second, the
>             checks were (depending on the version) only performed when referenced
>             through Methodref/Fieldref/InterfaceMethodref/InvokeDynamic, meaning
>             that non-referenced NameAndType bytecodes did not get checked like
>             they were supposed to. My change enforces the spec in both aspects.
>             To summarize:
>
>             The existing code had:
>             - strict checks for pre-5.0
>             - incomplete/non-spec-compliant checks for 5.0-and-later
>             - no checks for un-referenced NameAndType (A) names and (B)
>             6.0-and-earlier signatures.
>
>             My change has:
>             - the same strict checks for pre-5.0
>             - complete/spec-compliant checks for 5.0-and-later
>             - all checks moved to the NameAndType section so all names and
>             signatures will be checked regardless of whether NameAndType is
>             referenced.
>
>             Bug:https://bugs.openjdk.java.net/browse/JDK-8161224
>             Open webrev:http://cr.openjdk.java.net/~rprotacio/8161224.00/
>
>             Testing: The jck tests which had been failing for this bug now pass,
>             along with all other jck vm tests. Also tested with JPRT and RBT
>             hotspot_all and noncolo tests.
>
>             A compatibility request has been approved for this change.
>
>             Thank you,
>             Rachel
>
>



More information about the hotspot-runtime-dev mailing list