沙盒线程,捕获StackOverflowErrors

时间:2013-08-21 02:06:36

标签: java thread-safety sandbox code-injection stack-overflow

我想沙箱一个应用程序,最终用户可以将Java代码提交到编译和执行它的服务器(基于Web的IDE作为教育游戏的一部分)。通过使用标准安全管理器或使用ASM或类似的白名单验证使用的API,可以轻松处理大多数方面。

一个开放的问题是如何处理无限循环。由于线程有自己的堆栈,StackOverFlowErrors似乎是线程本地的。我做了一点刺激并想出了这个:

public class TryToSurviveAStackOverflow {

public static void main(String[] args) throws Exception {

    final Runnable infiniteLoop = new Runnable() {
        @Override public void run() {
            run();
        }
    };

    Runnable sandboxed = new Runnable() {
            @Override public void run() {
                try {
                    Thread.sleep(10000); // some time to connect VisualVM to monitor this
                    infiniteLoop.run();
                }
                catch (StackOverflowError x) {
                    System.err.println("Thread crashed with stack overflow");
                } catch (InterruptedException e) {
                    System.err.println("Thread interruped");
                }
            }
        };

        Thread thread = new Thread(sandboxed,"infinite loop");
        thread.start();
        thread.join();
        System.out.println(thread.getState());

        System.out.println("I am still alive");

}

}

这似乎有效,但这有多安全?特别是,不安全线程使用的堆栈空间会发生什么?我可以看到线程的状态设置为TERMINATED。

任何帮助/指针都非常感谢!

干杯,詹斯

0 个答案:

没有答案