FELIX-4963 : Eventadmin leaks caller's security context downstream. Apply patch from Ray Auge

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1691981 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/Configuration.java b/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/Configuration.java
index fd97f9d..fc51f5c 100644
--- a/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/Configuration.java
+++ b/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/Configuration.java
@@ -18,6 +18,9 @@
  */
 package org.apache.felix.eventadmin.impl;
 
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 
 import java.util.Dictionary;
 import java.util.Hashtable;
@@ -172,9 +175,13 @@
 
     private ServiceRegistration m_managedServiceReg;
 
+    // the access control context
+    private final AccessControlContext acc;
+
     public Configuration( BundleContext bundleContext )
     {
         m_bundleContext = bundleContext;
+        this.acc = AccessController.getContext();
 
         // default configuration
         configure( null );
@@ -219,10 +226,24 @@
             @Override
             public void run()
             {
-                synchronized ( Configuration.this )
+                if (System.getSecurityManager() != null)
                 {
-                    Configuration.this.configure( config );
-                    Configuration.this.startOrUpdate();
+                    AccessController.doPrivileged(
+                        new PrivilegedAction<Void>() {
+
+                            @Override
+                            public Void run() {
+                                updateFromConfigAdmin0( config );
+                                return null;
+                            }
+
+                        },
+                        acc
+                    );
+                }
+                else
+                {
+                    updateFromConfigAdmin0( config );
                 }
             }
 
@@ -230,6 +251,14 @@
 
     }
 
+    void updateFromConfigAdmin0(final Dictionary<String, ?> config) {
+        synchronized ( Configuration.this )
+        {
+            Configuration.this.configure( config );
+            Configuration.this.startOrUpdate();
+        }
+    }
+
     /**
      * Configures this instance.
      */