提交 667e211c 编写于 作者: A asaha

6977952: Test: Sync missing tests from hs16.3 to hs17.x

Reviewed-by: wrockett
上级 259fe3f5
/*
* @test
* @bug 6894807
* @summary No ClassCastException for HashAttributeSet constructors if run with -Xcomp
* @compile IsInstanceTest.java
* @run shell Test6894807.sh
*/
public class IsInstanceTest {
public static void main(String[] args) {
BaseInterface baseInterfaceImpl = new BaseInterfaceImpl();
for (int i = 0; i < 100000; i++) {
if (isInstanceOf(baseInterfaceImpl, ExtendedInterface.class)) {
System.out.println("Failed at index:" + i);
System.out.println("Arch: "+System.getProperty("os.arch", "")+
" OS: "+System.getProperty("os.name", "")+
" OSV: "+System.getProperty("os.version", "")+
" Cores: "+Runtime.getRuntime().availableProcessors()+
" JVM: "+System.getProperty("java.version", "")+" "+System.getProperty("sun.arch.data.model", ""));
break;
}
}
System.out.println("Done!");
}
public static boolean isInstanceOf(BaseInterface baseInterfaceImpl, Class... baseInterfaceClasses) {
for (Class baseInterfaceClass : baseInterfaceClasses) {
if (baseInterfaceClass.isInstance(baseInterfaceImpl)) {
return true;
}
}
return false;
}
private interface BaseInterface {
}
private interface ExtendedInterface extends BaseInterface {
}
private static class BaseInterfaceImpl implements BaseInterface {
}
}
#!/bin/sh
if [ "${TESTSRC}" = "" ]
then TESTSRC=.
fi
if [ "${TESTJAVA}" = "" ]
then
PARENT=`dirname \`which java\``
TESTJAVA=`dirname ${PARENT}`
echo "TESTJAVA not set, selecting " ${TESTJAVA}
echo "If this is incorrect, try setting the variable manually."
fi
if [ "${TESTCLASSES}" = "" ]
then
echo "TESTCLASSES not set. Test cannot execute. Failed."
exit 1
fi
BIT_FLAG=""
# set platform-dependent variables
OS=`uname -s`
case "$OS" in
SunOS | Linux )
NULL=/dev/null
PS=":"
FS="/"
## for solaris, linux it's HOME
FILE_LOCATION=$HOME
if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ]
then
BIT_FLAG=`cat ${FILE_LOCATION}${FS}JDK64BIT | grep -v '^#'`
fi
;;
Windows_* )
NULL=NUL
PS=";"
FS="\\"
;;
* )
echo "Unrecognized system!"
exit 1;
;;
esac
JEMMYPATH=${CPAPPEND}
CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH
THIS_DIR=`pwd`
${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -version
${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -server IsInstanceTest > test.out 2>&1
cat test.out
grep "Failed at index" test.out
if [ $? = 0 ]
then
echo "Test Failed"
exit 1
else
echo "Test Passed"
exit 0
fi
// A simple interface, to allow an unknown foreign call from a class
// loaded with LOADER1 to a class loaded with LOADER2.
public interface IFace {
public many_loader[] gen();
}
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
public class Loader2 extends ClassLoader {
int _recur;
public void print( String msg ) {
for( int i=0; i<_recur; i++ )
System.out.print(" ");
System.out.println(">>Loader2>> "+msg);
}
protected Class findClass2(String name) throws ClassNotFoundException {
print("Fetching the implementation of "+name);
int old = _recur;
try {
FileInputStream fi = new FileInputStream(name+".impl2");
byte result[] = new byte[fi.available()];
fi.read(result);
print("DefineClass1 on "+name);
_recur++;
Class clazz = defineClass(name, result, 0, result.length);
_recur = old;
print("Returning newly loaded class.");
return clazz;
} catch (Exception e) {
_recur = old;
print("Not found on disk.");
// If we caught an exception, either the class was not found or
// it was unreadable by our process.
return null;
//throw new ClassNotFoundException(e.toString());
}
}
protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
// Attempt a disk load first
Class c = findClass2(name);
if( c == null ) {
// check if the class has already been loaded
print("Checking for prior loaded class "+name);
c = findLoadedClass(name);
print("Letting super-loader load "+name);
int old = _recur;
_recur++;
c = super.loadClass(name, false);
_recur=old;
}
if (resolve) { print("Resolving class "+name); resolveClass(c); }
print("Returning clazz "+c.getClassLoader()+":"+name);
return c;
}
}
#
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
#
#
# @test @(#)Test6626217.sh
# @bug 6626217
# @summary Loader-constraint table allows arrays instead of only the base-classes
# @run shell Test6626217.sh
#
if [ "${TESTSRC}" = "" ]
then TESTSRC=.
fi
if [ "${TESTJAVA}" = "" ]
then
PARENT=`dirname \`which java\``
TESTJAVA=`dirname ${PARENT}`
echo "TESTJAVA not set, selecting " ${TESTJAVA}
echo "If this is incorrect, try setting the variable manually."
fi
if [ "${TESTCLASSES}" = "" ]
then
echo "TESTCLASSES not set. Test cannot execute. Failed."
exit 1
fi
BIT_FLAG=""
# set platform-dependent variables
OS=`uname -s`
case "$OS" in
SunOS | Linux )
NULL=/dev/null
PS=":"
FS="/"
RM=/bin/rm
CP=/bin/cp
MV=/bin/mv
## for solaris, linux it's HOME
FILE_LOCATION=$HOME
if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ]
then
BIT_FLAG=`cat ${FILE_LOCATION}${FS}JDK64BIT`
fi
;;
Windows_* )
NULL=NUL
PS=";"
FS="\\"
RM=rm
CP=cp
MV=mv
;;
* )
echo "Unrecognized system!"
exit 1;
;;
esac
JEMMYPATH=${CPAPPEND}
CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH
THIS_DIR=`pwd`
JAVA=${TESTJAVA}${FS}bin${FS}java
JAVAC=${TESTJAVA}${FS}bin${FS}javac
${JAVA} ${BIT_FLAG} -version
# Current directory is scratch directory, copy all the test source there
# (for the subsequent moves to work).
${CP} ${TESTSRC}${FS}* ${THIS_DIR}
# A Clean Compile: this line will probably fail within jtreg as have a clean dir:
${RM} -f *.class *.impl many_loader.java
# Compile all the usual suspects, including the default 'many_loader'
${CP} many_loader1.java.foo many_loader.java
${JAVAC} -source 1.4 -target 1.4 -Xlint *.java
# Rename the class files, so the custom loader (and not the system loader) will find it
${MV} from_loader2.class from_loader2.impl2
# Compile the next version of 'many_loader'
${MV} many_loader.class many_loader.impl1
${CP} many_loader2.java.foo many_loader.java
${JAVAC} -source 1.4 -target 1.4 -Xlint many_loader.java
# Rename the class file, so the custom loader (and not the system loader) will find it
${MV} many_loader.class many_loader.impl2
${MV} many_loader.impl1 many_loader.class
${RM} many_loader.java
${JAVA} ${BIT_FLAG} -Xverify -Xint -cp . bug_21227 >test.out 2>&1
grep "violates loader constraints" test.out
exit $?
// I can cast any old thing I want to this type object:
public class You_Have_Been_P0wned {
// Make a bunch of int-fields so I can peek & poke it
int _a;
int _b;
int _c;
int _d;
}
import java.lang.reflect.*;
import java.security.*;
abstract public class bug_21227 {
// Jam anything you want in here, it will be cast to a You_Have_Been_P0wned
public static Object _p0wnee;
public static void main(String argv[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
System.out.println("Warmup");
// Make a Class 'many_loader' under the default loader
bug_21227 bug = new many_loader();
// Some classes under a new Loader, LOADER2, including another version of 'many_loader'
ClassLoader LOADER2 = new Loader2();
Class clazz2 = LOADER2.loadClass("from_loader2");
IFace iface = (IFace)clazz2.newInstance();
// Set the victim, a String of length 6
String s = "victim";
_p0wnee = s;
// Go cast '_p0wnee' to type You_Have_Been_P0wned
many_loader[] x2 = bug.make(iface);
many_loader b = x2[0];
// Make it clear that the runtime type many_loader (what we get from the
// array X2) varies from the static type of many_loader.
Class cl1 = b.getClass();
ClassLoader ld1 = cl1.getClassLoader();
Class cl2 = many_loader.class;
ClassLoader ld2 = cl2.getClassLoader();
System.out.println("bug.make() "+ld1+":"+cl1);
System.out.println("many_loader "+ld2+":"+cl2);
// Read the victims guts out
You_Have_Been_P0wned q = b._p0wnee;
System.out.println("q._a = 0x"+Integer.toHexString(q._a));
System.out.println("q._b = 0x"+Integer.toHexString(q._b));
System.out.println("q._c = 0x"+Integer.toHexString(q._c));
System.out.println("q._d = 0x"+Integer.toHexString(q._d));
System.out.println("I will now crash the VM:");
// On 32-bit HotSpot Java6 this sets the victim String length shorter, then crashes the VM
//q._c = 3;
q._a = -1;
System.out.println(s);
}
// I need to compile (hence call in a loop) a function which returns a value
// loaded from classloader other than the system one. The point of this
// call is to give me an abstract 'hook' into a function loaded with a
// foreign loader.
public abstract many_loader[] make( IFace iface ); // abstract factory
}
// A simple class to extend an abstract class and get loaded with different
// loaders. This class is loaded via LOADER2.
public class from_loader2 implements IFace {
public many_loader[] gen() {
many_loader[] x = new many_loader[1];
x[0] = new many_loader();
return x;
}
}
// A simple class to extend an abstract class and get loaded with different
// loaders. This class is loaded via LOADER1. A similar named class will
// be loaded via LOADER2.
public class many_loader extends bug_21227 {
public You_Have_Been_P0wned _p0wnee;
// I need to compile (hence call in a loop) a function which returns a value
// loaded from classloader other than the system one. The point of this
// call is to give me an abstract 'hook' into a function loaded with a
// foreign loader.
// The original 'make(boolean)' returns a bug_21227. The VM will inject a
// synthetic method to up-cast the returned 'from_loader1' into a
// 'bug_21227'.
public many_loader[] make( IFace iface ) {
// This function needs to return a value known to be loaded from LOADER2.
// Since I need to use a yet different loader, I need to make an unknown
// foreign call. In this case I'll be using an interface to make the
// unknown call, with but a single implementor so the compiler can do the
// upcast statically.
return iface==null ? null : iface.gen();
}
}
// A simple class to extend an abstract class and get loaded with different
// loaders. This class is loaded via LOADER2. A similar named class will
// be loaded via LOADER1.
public class many_loader extends bug_21227 {
final Object _ref_to_be_p0wned;
many_loader() {
_ref_to_be_p0wned = bug_21227._p0wnee;
System.out.println("Gonna hack this thing: " + _ref_to_be_p0wned.toString() );
}
// I need to compile (hence call in a loop) a function which returns a value
// loaded from classloader other than the system one. The point of this
// call is to give me an abstract 'hook' into a function loaded with a
// foreign loader.
public many_loader[] make( IFace iface ) {
throw new Error("do not call me");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册