[SSHD-668] AccessControlException running under OSGi container
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java
index 0171d34..9867097 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java
@@ -28,6 +28,9 @@
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
public abstract class Nio2CompletionHandler<V, A> implements CompletionHandler<V, A> {
+ protected Nio2CompletionHandler() {
+ super();
+ }
@Override
public void completed(final V result, final A attachment) {
@@ -54,5 +57,4 @@
protected abstract void onCompleted(V result, A attachment);
protected abstract void onFailed(Throwable exc, A attachment);
-
}
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java
index f90ecd1..777f14e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java
@@ -21,6 +21,9 @@
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
import java.util.Collections;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
@@ -170,8 +173,26 @@
}
@Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
+ public Thread newThread(final Runnable r) {
+ Thread t;
+ try {
+ // see SSHD-668
+ t = AccessController.doPrivileged(new PrivilegedExceptionAction<Thread>() {
+ @SuppressWarnings("synthetic-access")
+ @Override
+ public Thread run() {
+ return new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
+ }
+ });
+ } catch (PrivilegedActionException e) {
+ Exception err = e.getException();
+ if (err instanceof RuntimeException) {
+ throw (RuntimeException) err;
+ } else {
+ throw new RuntimeException(err);
+ }
+ }
+
if (!t.isDaemon()) {
t.setDaemon(true);
}