6583051: crash when adding non-static methods to java.lang.Object class
Stop the JVM if java.lang.Object is incorrectly defined rather than crashing. Reviewed-by: ctornqvi, dholmes
This commit is contained in:
parent
1c18aef92c
commit
2b871d6987
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2015, 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
|
||||
@ -100,17 +100,21 @@ void klassVtable::compute_vtable_size_and_num_mirandas(
|
||||
vtable_length = Universe::base_vtable_size();
|
||||
}
|
||||
|
||||
if (super == NULL && !Universe::is_bootstrapping() &&
|
||||
vtable_length != Universe::base_vtable_size()) {
|
||||
// Someone is attempting to redefine java.lang.Object incorrectly. The
|
||||
// only way this should happen is from
|
||||
// SystemDictionary::resolve_from_stream(), which will detect this later
|
||||
// and throw a security exception. So don't assert here to let
|
||||
// the exception occur.
|
||||
vtable_length = Universe::base_vtable_size();
|
||||
if (super == NULL && vtable_length != Universe::base_vtable_size()) {
|
||||
if (Universe::is_bootstrapping()) {
|
||||
// Someone is attempting to override java.lang.Object incorrectly on the
|
||||
// bootclasspath. The JVM cannot recover from this error including throwing
|
||||
// an exception
|
||||
vm_exit_during_initialization("Incompatible definition of java.lang.Object");
|
||||
} else {
|
||||
// Someone is attempting to redefine java.lang.Object incorrectly. The
|
||||
// only way this should happen is from
|
||||
// SystemDictionary::resolve_from_stream(), which will detect this later
|
||||
// and throw a security exception. So don't assert here to let
|
||||
// the exception occur.
|
||||
vtable_length = Universe::base_vtable_size();
|
||||
}
|
||||
}
|
||||
assert(super != NULL || vtable_length == Universe::base_vtable_size(),
|
||||
"bad vtable size for class Object");
|
||||
assert(vtable_length % vtableEntry::size() == 0, "bad vtable length");
|
||||
assert(vtable_length >= Universe::base_vtable_size(), "vtable too small");
|
||||
|
||||
|
44
hotspot/test/runtime/BadObjectClass/BootstrapRedefine.java
Normal file
44
hotspot/test/runtime/BadObjectClass/BootstrapRedefine.java
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 6583051
|
||||
* @summary Give error if java.lang.Object has been incompatibly overridden on the bootpath
|
||||
* @library /testlibrary
|
||||
* @compile Object.java
|
||||
* @run main BootstrapRedefine
|
||||
*/
|
||||
|
||||
import com.oracle.java.testlibrary.*;
|
||||
|
||||
public class BootstrapRedefine {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
String testClasses = System.getProperty("test.classes", ".");
|
||||
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xbootclasspath/p:" + testClasses, "-version");
|
||||
new OutputAnalyzer(pb.start())
|
||||
.shouldContain("Incompatible definition of java.lang.Object")
|
||||
.shouldHaveExitValue(1);
|
||||
}
|
||||
}
|
37
hotspot/test/runtime/BadObjectClass/Object.java
Normal file
37
hotspot/test/runtime/BadObjectClass/Object.java
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package java.lang;
|
||||
|
||||
/**
|
||||
* This is a fake java.lang.Object class.
|
||||
*/
|
||||
public class Object {
|
||||
|
||||
// Add some methods
|
||||
void dummy1() { return; }
|
||||
void dummy2() { return; }
|
||||
void dummy3() { return; }
|
||||
}
|
Loading…
Reference in New Issue
Block a user