我如何才能最好地对Duktape的引擎加工限制?

时间:2016-09-30 15:57:04

标签: duktape

我意识到DUK_USE_EXEC_TIMEOUT_CHECK的使用是实验性的(从1.5开始),但我不清楚如何最好地利用它。我试图做的是严格限制操作码执行,以防止坏脚本通过无限循环,大型处理块等来杀死我的进程。我已经定义了我认为合适的东西,即:< / p>

#define DUK_OPT_INTERRUPT_COUNTER
#define DUK_OPT_EXEC_TIMEOUT_CHECK duk_my_exec_timeout

int duk_my_exec_timeout( void *udata ) {
    return stop_processing ? 1 : 0;
}

问题:我有很多背景,但udata并不足以将它们区分为尽可能接近。但是,这可能不是我的需要所必需的。

问题:该功能会在意外的地方被调用,例如在duk_create_heap甚至是简单的duk_peval_string来电时,我无法知道原因。

通过修改duk__executor_interrupt代码以传递线程/上下文interrupt_init成员,我现在已经将我认为让我了解的内容如此:

if (DUK_USE_EXEC_TIMEOUT_CHECK(thr->interrupt_init, thr->heap->heap_udata)) {
    ...
}

似乎当它非零时,我已达到一些内部操作码处理限制。听起来不错吗?

我的超时程序如下:

int duk_my_exec_timeout( int interrupt, void *udata ) {
    if ( interrupt ) {
        return 1;
    }
    else {
        return 0;
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

中断检查宏旨在被调用&#34;偶尔&#34;通过引擎,所以没有一个固定的地方,你应该期望它被调用。典型的解决方案是在开始操作时记录开始时间戳,并在宏中检查当前时间与开始时间(实际上,宏调用的函数)。当差异足够大时,可以指示超时,这会导致RangeError传播出引擎。