Thu, 03 May 2012 15:37:46 -0400
7160757: Problem with hotspot/runtime_classfile
Summary: Allow only current and super invokespecials of <init>
Reviewed-by: never, coleenp, dcubed
src/share/vm/classfile/verifier.cpp | file | annotate | diff | comparison | revisions | |
test/runtime/7160757/Test7160757.java | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/classfile/verifier.cpp Thu Apr 12 12:07:09 2012 -0700 1.2 +++ b/src/share/vm/classfile/verifier.cpp Thu May 03 15:37:46 2012 -0400 1.3 @@ -1880,10 +1880,10 @@ 1.4 VerificationType type = current_frame->pop_stack( 1.5 VerificationType::reference_check(), CHECK_VERIFY(this)); 1.6 if (type == VerificationType::uninitialized_this_type()) { 1.7 - // The method must be an <init> method of either this class, or one of its 1.8 - // superclasses 1.9 + // The method must be an <init> method of this class or its superclass 1.10 + klassOop superk = current_class()->super(); 1.11 if (ref_class_type.name() != current_class()->name() && 1.12 - !name_in_supers(ref_class_type.name(), current_class())) { 1.13 + ref_class_type.name() != superk->klass_part()->name()) { 1.14 verify_error(bci, "Bad <init> method call"); 1.15 return; 1.16 }
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/runtime/7160757/Test7160757.java Thu May 03 15:37:46 2012 -0400 2.3 @@ -0,0 +1,82 @@ 2.4 +/* 2.5 + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. 2.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 2.7 + * 2.8 + * This code is free software; you can redistribute it and/or modify it 2.9 + * under the terms of the GNU General Public License version 2 only, as 2.10 + * published by the Free Software Foundation. 2.11 + * 2.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 2.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 2.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 2.15 + * version 2 for more details (a copy is included in the LICENSE file that 2.16 + * accompanied this code). 2.17 + * 2.18 + * You should have received a copy of the GNU General Public License version 2.19 + * 2 along with this work; if not, write to the Free Software Foundation, 2.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2.21 + * 2.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2.23 + * or visit www.oracle.com if you need additional information or have any 2.24 + * questions. 2.25 + */ 2.26 + 2.27 +/* 2.28 + * @test Test7160757.java 2.29 + * @bug 7160757 2.30 + * @summary Tests that superclass initialization is not skipped 2.31 + */ 2.32 + 2.33 +public class Test7160757 { 2.34 + 2.35 + public static void main(String args[]) throws Exception { 2.36 + 2.37 + ClassLoader loader = new SLoader(); 2.38 + try { 2.39 + Class.forName("S", true, loader); 2.40 + System.out.println("FAILED"); 2.41 + throw new Exception("Should have thrown a VerifyError."); 2.42 + } catch (VerifyError e) { 2.43 + System.out.println(e); 2.44 + System.out.println("PASSED"); 2.45 + } 2.46 + } 2.47 + 2.48 + static class SLoader extends ClassLoader { 2.49 + 2.50 + /** 2.51 + * public class S extends Throwable { 2.52 + * public S() { 2.53 + * aload_0 2.54 + * invokespecial Object.<init>() 2.55 + * return 2.56 + * } 2.57 + * } 2.58 + */ 2.59 + static byte b(int i) { return (byte)i; } 2.60 + static byte S_class[] = { 2.61 + b(0xca), b(0xfe), b(0xba), b(0xbe), 0x00, 0x00, 0x00, 0x32, 2.62 + 0x00, 0x0c, 0x0a, 0x00, 0x0b, 0x00, 0x07, 0x07, 2.63 + 0x00, 0x08, 0x07, 0x00, 0x09, 0x01, 0x00, 0x06, 2.64 + 0x3c, 0x69, 0x6e, 0x69, 0x74, 0x3e, 0x01, 0x00, 2.65 + 0x03, 0x28, 0x29, 0x56, 0x01, 0x00, 0x04, 0x43, 2.66 + 0x6f, 0x64, 0x65, 0x0c, 0x00, 0x04, 0x00, 0x05, 2.67 + 0x01, 0x00, 0x01, 0x53, 0x01, 0x00, 0x13, 0x6a, 2.68 + 0x61, 0x76, 0x61, 0x2f, 0x6c, 0x61, 0x6e, 0x67, 2.69 + 0x2f, 0x54, 0x68, 0x72, 0x6f, 0x77, 0x61, 0x62, 2.70 + 0x6c, 0x65, 0x01, 0x00, 0x10, 0x6a, 0x61, 0x76, 2.71 + 0x61, 0x2f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x4f, 2.72 + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x07, 0x00, 0x0a, 2.73 + 0x00, 0x21, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 2.74 + 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 2.75 + 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 2.76 + 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 2.77 + 0x00, 0x05, 0x2a, b(0xb7), 0x00, 0x01, b(0xb1), 0x00, 2.78 + 0x00, 0x00, 0x00, 0x00, 0x00 2.79 + }; 2.80 + 2.81 + public Class findClass(String name) throws ClassNotFoundException { 2.82 + return defineClass(name, S_class, 0, S_class.length); 2.83 + } 2.84 + } 2.85 +}