Author: pauls
Date: Wed Nov 25 21:03:31 2009
New Revision: 884272

URL: http://svn.apache.org/viewvc?rev=884272&view=rev
Log:
Make sure we do a doPriv when we call getClassLoader inside Util (FELIX-1101).

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
    
felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
    
felix/trunk/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java
    
felix/trunk/framework/src/main/java/org/apache/felix/framework/util/Util.java

Modified: 
felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java?rev=884272&r1=884271&r2=884272&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java 
(original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java 
Wed Nov 25 21:03:31 2009
@@ -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(

Modified: 
felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java?rev=884272&r1=884271&r2=884272&view=diff
==============================================================================
--- 
felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
 (original)
+++ 
felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
 Wed Nov 25 21:03:31 2009
@@ -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)

Modified: 
felix/trunk/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java?rev=884272&r1=884271&r2=884272&view=diff
==============================================================================
--- 
felix/trunk/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java
 (original)
+++ 
felix/trunk/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java
 Wed Nov 25 21:03:31 2009
@@ -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;
         }

Modified: 
felix/trunk/framework/src/main/java/org/apache/felix/framework/util/Util.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/Util.java?rev=884272&r1=884271&r2=884272&view=diff
==============================================================================
--- 
felix/trunk/framework/src/main/java/org/apache/felix/framework/util/Util.java 
(original)
+++ 
felix/trunk/framework/src/main/java/org/apache/felix/framework/util/Util.java 
Wed Nov 25 21:03:31 2009
@@ -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;


Reply via email to