Invoke weaving hook in privileged block. (FELIX-2959)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1153145 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
index a0e9723..4b3fed1 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
@@ -1958,8 +1958,8 @@
{
try
{
-// TODO: OSGi R4.3 - Need to call all hooks in privileged block.
- wh.weave(wci);
+ m_revision.getSecureAction()
+ .invokeWeavingHook(wh, wci);
}
catch (Throwable th)
{
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 4ed8ccc..4a27c47 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
@@ -1091,6 +1091,30 @@
}
}
+ public void invokeWeavingHook(
+ org.osgi.framework.hooks.weaving.WeavingHook wh,
+ org.osgi.framework.hooks.weaving.WovenClass wc)
+ throws Exception
+ {
+ if (System.getSecurityManager() != null)
+ {
+ Actions actions = (Actions) m_actions.get();
+ actions.set(Actions.INVOKE_WEAVING_HOOK, wh, wc);
+ try
+ {
+ AccessController.doPrivileged(actions, m_acc);
+ }
+ catch (PrivilegedActionException e)
+ {
+ throw e.getException();
+ }
+ }
+ else
+ {
+ wh.weave(wc);
+ }
+ }
+
private static class Actions implements PrivilegedExceptionAction
{
public static final int INITIALIZE_CONTEXT_ACTION = 0;
@@ -1135,6 +1159,7 @@
public static final int GET_CLASS_LOADER_ACTION = 39;
public static final int INVOKE_BUNDLE_FIND_HOOK = 40;
public static final int INVOKE_BUNDLE_EVENT_HOOK = 41;
+ public static final int INVOKE_WEAVING_HOOK = 42;
private int m_action = -1;
private Object m_arg1 = null;
@@ -1316,6 +1341,10 @@
((org.osgi.framework.hooks.bundle.EventHook) arg1).event(
(BundleEvent) arg2, (Collection<BundleContext>) arg3);
return null;
+ case INVOKE_WEAVING_HOOK:
+ ((org.osgi.framework.hooks.weaving.WeavingHook) arg1).weave(
+ (org.osgi.framework.hooks.weaving.WovenClass) arg2);
+ return null;
}
return null;