This commit is contained in:
Alejandro Murillo 2014-06-26 23:11:00 -07:00
commit 104ef4e582
5 changed files with 28 additions and 27 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -130,11 +130,15 @@ public final class Class<T> implements java.io.Serializable,
} }
/* /*
* Constructor. Only the Java Virtual Machine creates Class * Private constructor. Only the Java Virtual Machine creates Class objects.
* objects. * This constructor is not used and prevents the default constructor being
* generated.
*/ */
private Class() {} private Class(ClassLoader loader) {
// Initialize final field for classLoader. The initialization value of non-null
// prevents future JIT optimizations from assuming this final field is null.
classLoader = loader;
}
/** /**
* Converts the object to a string. The string representation is the * Converts the object to a string. The string representation is the
@ -677,8 +681,10 @@ public final class Class<T> implements java.io.Serializable,
} }
// Package-private to allow ClassLoader access // Package-private to allow ClassLoader access
native ClassLoader getClassLoader0(); ClassLoader getClassLoader0() { return classLoader; }
// Initialized in JVM not by private constructor
private final ClassLoader classLoader;
/** /**
* Returns an array of {@code TypeVariable} objects that represent the * Returns an array of {@code TypeVariable} objects that represent the

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -129,16 +129,24 @@ public class AccessibleObject implements AnnotatedElement {
setAccessible0(this, flag); setAccessible0(this, flag);
} }
/* Check that you aren't exposing java.lang.Class.<init>. */ /* Check that you aren't exposing java.lang.Class.<init> or sensitive
fields in java.lang.Class. */
private static void setAccessible0(AccessibleObject obj, boolean flag) private static void setAccessible0(AccessibleObject obj, boolean flag)
throws SecurityException throws SecurityException
{ {
if (obj instanceof Constructor && flag == true) { if (obj instanceof Constructor && flag == true) {
Constructor<?> c = (Constructor<?>)obj; Constructor<?> c = (Constructor<?>)obj;
if (c.getDeclaringClass() == Class.class) { if (c.getDeclaringClass() == Class.class) {
throw new SecurityException("Can not make a java.lang.Class" + throw new SecurityException("Cannot make a java.lang.Class" +
" constructor accessible"); " constructor accessible");
} }
} else if (obj instanceof Field && flag == true) {
Field f = (Field)obj;
if (f.getDeclaringClass() == Class.class &&
f.getName().equals("classLoader")) {
throw new SecurityException("Cannot make java.lang.Class.classLoader" +
" accessible");
}
} }
obj.override = flag; obj.override = flag;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -426,9 +426,6 @@ JVM_GetClassName(JNIEnv *env, jclass cls);
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL
JVM_GetClassInterfaces(JNIEnv *env, jclass cls); JVM_GetClassInterfaces(JNIEnv *env, jclass cls);
JNIEXPORT jobject JNICALL
JVM_GetClassLoader(JNIEnv *env, jclass cls);
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL
JVM_IsInterface(JNIEnv *env, jclass cls); JVM_IsInterface(JNIEnv *env, jclass cls);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -1357,16 +1357,9 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset)
} }
(*env)->DeleteLocalRef(env, super); (*env)->DeleteLocalRef(env, super);
/* The optimizer make cause this to happen on local code */ /* The optimizer may cause this to happen on local code */
if (not_found) { if (not_found) {
#ifdef BROKEN_JAVAC CCerror(context, "Illegal use of nonvirtual function call");
jobject loader = JVM_GetClassLoader(env, context->class);
int has_loader = (loader != 0);
(*env)->DeleteLocalRef(env, loader);
if (has_loader)
#endif /* BROKEN_JAVAC */
CCerror(context,
"Illegal use of nonvirtual function call");
} }
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -45,7 +45,6 @@ extern jboolean VerifyFixClassname(char *utf_name);
#define CLS "Ljava/lang/Class;" #define CLS "Ljava/lang/Class;"
#define CPL "Lsun/reflect/ConstantPool;" #define CPL "Lsun/reflect/ConstantPool;"
#define STR "Ljava/lang/String;" #define STR "Ljava/lang/String;"
#define JCL "Ljava/lang/ClassLoader;"
#define FLD "Ljava/lang/reflect/Field;" #define FLD "Ljava/lang/reflect/Field;"
#define MHD "Ljava/lang/reflect/Method;" #define MHD "Ljava/lang/reflect/Method;"
#define CTR "Ljava/lang/reflect/Constructor;" #define CTR "Ljava/lang/reflect/Constructor;"
@ -56,7 +55,6 @@ static JNINativeMethod methods[] = {
{"getName0", "()" STR, (void *)&JVM_GetClassName}, {"getName0", "()" STR, (void *)&JVM_GetClassName},
{"getSuperclass", "()" CLS, NULL}, {"getSuperclass", "()" CLS, NULL},
{"getInterfaces0", "()[" CLS, (void *)&JVM_GetClassInterfaces}, {"getInterfaces0", "()[" CLS, (void *)&JVM_GetClassInterfaces},
{"getClassLoader0", "()" JCL, (void *)&JVM_GetClassLoader},
{"isInterface", "()Z", (void *)&JVM_IsInterface}, {"isInterface", "()Z", (void *)&JVM_IsInterface},
{"getSigners", "()[" OBJ, (void *)&JVM_GetClassSigners}, {"getSigners", "()[" OBJ, (void *)&JVM_GetClassSigners},
{"setSigners", "([" OBJ ")V", (void *)&JVM_SetClassSigners}, {"setSigners", "([" OBJ ")V", (void *)&JVM_SetClassSigners},
@ -81,7 +79,6 @@ static JNINativeMethod methods[] = {
#undef OBJ #undef OBJ
#undef CLS #undef CLS
#undef STR #undef STR
#undef JCL
#undef FLD #undef FLD
#undef MHD #undef MHD
#undef CTR #undef CTR