https://issues.apache.org/bugzilla/show_bug.cgi?id=57091
Bug ID: 57091
Summary: Websockets cannot be used in Windows applet plugin
environments based on Oracle Java7
Product: Tomcat 8
Version: 8.0.14
Hardware: PC
Status: NEW
Severity: critical
Priority: P2
Component: WebSocket
Assignee: [email protected]
Reporter: [email protected]
When using the Tomcat8 Websockets implementation in a Windows JRE 1.7.0_67
applet environment an AccessControlException occurs even though a policy
allowing everything is in charge.
Exception in thread "anInnocuousThread" java.security.AccessControlException:
access denied ("java.lang.RuntimePermission" "setContextClassLoader")
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at sun.plugin2.applet.AWTAppletSecurityManager.checkPermission(Unknown
Source)
at java.lang.Thread.setContextClassLoader(Unknown Source)
at
org.apache.tomcat.websocket.AsyncChannelGroupUtil$AsyncIOThreadFactory.newThread(AsyncChannelGroupUtil.java:112)
at java.util.concurrent.ThreadPoolExecutor$Worker.<init>(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.addWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.execute(Unknown Source)
at
org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:161)
at
org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:141)
at sun.nio.ch.AsynchronousChannelGroupImpl.executeOnPooledThread(Unknown
Source)
at sun.nio.ch.Invoker.invokeIndirectly(Unknown Source)
at sun.nio.ch.Invoker.invoke(Unknown Source)
at sun.nio.ch.Invoker.invoke(Unknown Source)
at
sun.nio.ch.WindowsAsynchronousSocketChannelImpl$ReadTask.completed(Unknown
Source)
at sun.nio.ch.Iocp$EventHandlerTask.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
at sun.misc.InnocuousThread.run(Unknown Source)
The problem is actually in the JVM which installs a null protection domain
which fails every access checked operation. Apparantly Oracle won't fix this,
according to https://issues.apache.org/jira/browse/SSHD-332, but there is a
workaround which is fairly easy. It is modelled after the fix to the SSHD one
found in the link above.
Index:
/d/sd0h/h/niklas/java/workspace-1/Tomcat8/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java
===================================================================
---
/d/sd0h/h/niklas/java/workspace-1/Tomcat8/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java
(revision 1630809)
+++
/d/sd0h/h/niklas/java/workspace-1/Tomcat8/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java
(working copy)
@@ -18,6 +18,8 @@
import java.io.IOException;
import java.nio.channels.AsynchronousChannelGroup;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
@@ -106,12 +108,16 @@
private AtomicInteger count = new AtomicInteger(0);
@Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r);
- t.setName("WebSocketClient-AsyncIO-" + count.incrementAndGet());
- t.setContextClassLoader(this.getClass().getClassLoader());
- t.setDaemon(true);
- return t;
+ public Thread newThread(final Runnable r) {
+ return (Thread)AccessController.doPrivileged(new
PrivilegedAction<Object>() {
+ public Object run() {
+ Thread t = new Thread(r);
+ t.setName("WebSocketClient-AsyncIO-" +
count.incrementAndGet());
+ t.setContextClassLoader(this.getClass().getClassLoader());
+ t.setDaemon(true);
+ return t;
+ }
+ });
}
}
}
--
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]