summaryrefslogtreecommitdiffstats
path: root/libart
diff options
context:
space:
mode:
authorJeff Hao <jeffhao@google.com>2014-04-01 21:51:49 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-04-01 21:51:49 +0000
commitd9d0d1c593a34c6169e7f0a5b42aa8ae6af3daca (patch)
treee1c2b8b3e8f8afc7ce5ee5a1d33502a9129b20ce /libart
parent1a6b8f95187f791de9265aaa6d761e9181ab0e34 (diff)
parent96e2e4faf806aa22ca205354c16b04288d51ddbf (diff)
downloadlibcore-d9d0d1c593a34c6169e7f0a5b42aa8ae6af3daca.tar.gz
libcore-d9d0d1c593a34c6169e7f0a5b42aa8ae6af3daca.tar.bz2
libcore-d9d0d1c593a34c6169e7f0a5b42aa8ae6af3daca.zip
Merge "Fix reflection access checks for app compatibility in libcore."
Diffstat (limited to 'libart')
-rw-r--r--libart/src/main/java/java/lang/Class.java7
1 files changed, 7 insertions, 0 deletions
diff --git a/libart/src/main/java/java/lang/Class.java b/libart/src/main/java/java/lang/Class.java
index 36a55f5a3..ea41d6e01 100644
--- a/libart/src/main/java/java/lang/Class.java
+++ b/libart/src/main/java/java/lang/Class.java
@@ -1551,6 +1551,10 @@ public final class Class<T> implements Serializable, AnnotatedElement, GenericDe
if (isPrimitive() || isInterface() || isArray() || Modifier.isAbstract(accessFlags)) {
throw new InstantiationException(this + " cannot be instantiated");
}
+ Class<?> caller = VMStack.getStackClass1();
+ if (!caller.canAccess(this)) {
+ throw new IllegalAccessException(this + " is not accessible from " + caller);
+ }
Constructor<T> init;
try {
init = getDeclaredConstructor();
@@ -1560,6 +1564,9 @@ public final class Class<T> implements Serializable, AnnotatedElement, GenericDe
t.initCause(e);
throw t;
}
+ if (!caller.canAccessMember(this, init.getAccessFlags())) {
+ throw new IllegalAccessException(init + " is not accessible from " + caller);
+ }
try {
return init.newInstance(null, init.isAccessible());
} catch (InvocationTargetException e) {