Make sure we do a doPriv when we call getClassLoader inside Util (FELIX-1101).
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@884272 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index ddcc20b..4c6283a 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -2693,7 +2693,7 @@
{
for (int i = 0; i < classNames.length; i++)
{
- Class clazz = Util.loadClassUsingClass(svcObj.getClass(), classNames[i]);
+ Class clazz = Util.loadClassUsingClass(svcObj.getClass(), classNames[i], m_secureAction);
if (clazz == null)
{
throw new IllegalArgumentException(
diff --git a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
index 398f7fb..10b964e 100644
--- a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
@@ -171,7 +171,7 @@
// Case 1.
Class sourceClass = (m_factory != null) ? m_factory.getClass() : m_svcObj.getClass();
- return Util.loadClassUsingClass(sourceClass, clazz.getName()) == clazz;
+ return Util.loadClassUsingClass(sourceClass, clazz.getName(), Felix.m_secureAction) == clazz;
}
Object getProperty(String key)
@@ -315,7 +315,7 @@
{
for (int i = 0; i < m_classes.length; i++)
{
- Class clazz = Util.loadClassUsingClass(svcObj.getClass(), m_classes[i]);
+ Class clazz = Util.loadClassUsingClass(svcObj.getClass(), m_classes[i], Felix.m_secureAction);
if ((clazz == null) || !clazz.isAssignableFrom(svcObj.getClass()))
{
if (clazz == null)
diff --git a/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java b/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java
index ef9b979..a9bc4a4 100644
--- a/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java
+++ b/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java
@@ -137,6 +137,27 @@
return ClassLoader.getSystemClassLoader();
}
}
+
+ public ClassLoader getClassLoader(Class clazz)
+ {
+ if (System.getSecurityManager() != null)
+ {
+ try
+ {
+ Actions actions = (Actions) m_actions.get();
+ actions.set(Actions.GET_CLASS_LOADER_ACTION, clazz);
+ return (ClassLoader) AccessController.doPrivileged(actions, m_acc);
+ }
+ catch (PrivilegedActionException ex)
+ {
+ throw (RuntimeException) ex.getException();
+ }
+ }
+ else
+ {
+ return clazz.getClassLoader();
+ }
+ }
public Class forName(String name) throws ClassNotFoundException
{
@@ -1094,6 +1115,7 @@
public static final int SWAP_FIELD_ACTION = 38;
public static final int SYSTEM_EXIT_ACTION = 39;
public static final int FLUSH_FIELD_ACTION = 40;
+ public static final int GET_CLASS_LOADER_ACTION = 41;
private int m_action = -1;
private Object m_arg1 = null;
@@ -1340,6 +1362,10 @@
{
_flush(((Class) arg1), arg2);
}
+ else if (action == GET_CLASS_LOADER_ACTION)
+ {
+ return ((Class) arg1).getClassLoader();
+ }
return null;
}
diff --git a/framework/src/main/java/org/apache/felix/framework/util/Util.java b/framework/src/main/java/org/apache/felix/framework/util/Util.java
index 1c37219..8545707 100644
--- a/framework/src/main/java/org/apache/felix/framework/util/Util.java
+++ b/framework/src/main/java/org/apache/felix/framework/util/Util.java
@@ -158,16 +158,16 @@
* @return the loaded class or <tt>null</tt> if it could not be
* loaded.
**/
- public static Class loadClassUsingClass(Class clazz, String name)
+ public static Class loadClassUsingClass(Class clazz, String name, SecureAction action)
{
Class loadedClass = null;
while (clazz != null)
{
// Get the class loader of the current class object.
- ClassLoader loader = clazz.getClassLoader();
+ ClassLoader loader = action.getClassLoader(clazz);
// A null class loader represents the system class loader.
- loader = (loader == null) ? ClassLoader.getSystemClassLoader() : loader;
+ loader = (loader == null) ? action.getSystemClassLoader() : loader;
try
{
return loader.loadClass(name);
@@ -183,7 +183,7 @@
Class[] ifcs = clazz.getInterfaces();
for (int i = 0; i < ifcs.length; i++)
{
- loadedClass = loadClassUsingClass(ifcs[i], name);
+ loadedClass = loadClassUsingClass(ifcs[i], name, action);
if (loadedClass != null)
{
return loadedClass;