OpenJDK / amber / amber
changeset 56857:360f8769d3dc
8225789: Empty method parameter type should generate ClassFormatError
Summary: Check for an empty name when verifying unqualified names
Reviewed-by: lfoltan, coleenp
author | hseigel |
---|---|
date | Wed, 19 Jun 2019 08:42:15 -0400 |
parents | 80594c78a608 |
children | 0692b67f5462 |
files | src/hotspot/share/classfile/classFileParser.cpp test/hotspot/jtreg/runtime/classFileParserBug/EmptyUnqName.jasm test/hotspot/jtreg/runtime/classFileParserBug/TestEmptyUnqName.java test/hotspot/jtreg/runtime/verifier/TestSigParse.java |
diffstat | 4 files changed, 92 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/hotspot/share/classfile/classFileParser.cpp Wed Jun 19 12:25:12 2019 +0200 +++ b/src/hotspot/share/classfile/classFileParser.cpp Wed Jun 19 08:42:15 2019 -0400 @@ -4956,6 +4956,7 @@ bool ClassFileParser::verify_unqualified_name(const char* name, unsigned int length, int type) { + if (length == 0) return false; // Must have at least one char. for (const char* p = name; p != name + length; p++) { switch(*p) { case '.': @@ -5105,7 +5106,7 @@ int newlen = c - (char*) signature; bool legal = verify_unqualified_name(signature, newlen, LegalClass); if (!legal) { - classfile_parse_error("Class name contains illegal character " + classfile_parse_error("Class name is empty or contains illegal character " "in descriptor in class file %s", CHECK_0); return NULL;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/hotspot/jtreg/runtime/classFileParserBug/EmptyUnqName.jasm Wed Jun 19 08:42:15 2019 -0400 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +super public class EmptyUnqName version 56:0 { + + public Method "<init>":"()V" stack 1 locals 1 { + aload_0; + invokespecial Method java/lang/Object."<init>":"()V"; + return; + } + + public static Method main:"([Ljava/lang/String;)V" stack 2 locals 1 { + getstatic Field java/lang/System.out:"Ljava/io/PrintStream;"; + ldc String "Testing method param types"; + invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/String;)V"; + return; + } + + public static Method func:"(L;)V" stack 0 locals 1 { + return; + } + +} // end Class EmptyUnqName
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/hotspot/jtreg/runtime/classFileParserBug/TestEmptyUnqName.java Wed Jun 19 08:42:15 2019 -0400 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8225789 + * @summary Test that an unqualified name of "L;" causes a ClassFormatError exception. + * @compile EmptyUnqName.jasm + * @run main/othervm -Xverify:remote TestEmptyUnqName + */ + +public class TestEmptyUnqName { + public static void main(String args[]) throws Throwable { + + System.out.println("Regression test for bug 8225789"); + + try { + Class newClass = Class.forName("EmptyUnqName"); + throw new RuntimeException("Expected ClassFormatError exception not thrown"); + } catch (java.lang.ClassFormatError e) { + if (!e.getMessage().contains("Class name is empty or contains illegal character")) { + throw new RuntimeException("Wrong ClassFormatError: " + e.getMessage()); + } + } + } +}
--- a/test/hotspot/jtreg/runtime/verifier/TestSigParse.java Wed Jun 19 12:25:12 2019 +0200 +++ b/test/hotspot/jtreg/runtime/verifier/TestSigParse.java Wed Jun 19 08:42:15 2019 -0400 @@ -63,7 +63,7 @@ throw new RuntimeException("Expected ClasFormatError exception not thrown"); } catch (java.lang.ClassFormatError e) { String eMsg = e.getMessage(); - if (!eMsg.contains("Class name contains illegal character")) { + if (!eMsg.contains("Class name is empty or contains illegal character")) { throw new RuntimeException("Unexpected exception: " + eMsg); } }