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;