[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);
             }