From a2edf52b418743dc82a823ef1d65870584af4d4a Mon Sep 17 00:00:00 2001 From: frosch Date: Mon, 30 May 2016 21:03:11 +0000 Subject: (svn r27594) -Fix [FS#6473]: [Script] Kill scripts, when a non-suspendable valuator call takes way too long. --- src/script/api/script_list.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index bdbc1209b..d0c72b5bb 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -11,6 +11,7 @@ #include "../../stdafx.h" #include "script_list.hpp" +#include "script_controller.hpp" #include "../../debug.h" #include "../../script/squirrel.hpp" @@ -905,6 +906,16 @@ SQInteger ScriptList::Valuate(HSQUIRRELVM vm) } } + /* Kill the script when the valuator call takes way too long. + * Triggered by nesting valuators, which then take billions of iterations. */ + if (ScriptController::GetOpsTillSuspend() < -1000000) { + /* See below for explanation. The extra pop is the return value. */ + sq_pop(vm, nparam + 4); + + ScriptObject::SetAllowDoCommand(backup_allow); + return sq_throwerror(vm, "excessive CPU usage in valuator function"); + } + /* Was something changed? */ if (previous_modification_count != this->modifications) { /* See below for explanation. The extra pop is the return value. */ -- cgit v1.2.3-54-g00ecf